My database: I have companies which HABTM carbrands and HABTM goods
My search function:
public function search() {
$joins = array();
// HABTM
if (!empty($this->request->query['Carbrand'])) {
$carbrands = array(
'table' => 'carbrands_companies',
'alias' => 'CarbrandsCompany',
'type' => 'INNER',
'conditions' => array(
'CarbrandsCompany.carbrand_id' => $this->request->query['Carbrand'],
'CarbrandsCompany.company_id = Company.id'
),
);
$joins[] = $carbrands;
}
if (!empty($this->request->query['Good'])) {
$goods = array(
'table' => 'companies_goods',
'alias' => 'GoodsCompany',
'type' => 'INNER',
'conditions' => array(
'GoodsCompany.good_id' => $this->request->query['Good'],
'GoodsCompany.company_id = Company.id'
),
);
$joins[] = $goods;
}
// HABTM END
$this->paginate = array(
'fields' => array(
'DISTINCT Company.id',
'Company.name',
'Company.addr',
'Company.official',
),
'limit' => 10,
'joins' => $joins,
'conditions' => array(),
'contain' => array(),
'order' => array('Company.name' => 'asc')
);
$found = $this->paginate('Company');
if (!empty($found)) {
$this->set('companies', $found);
}else {
$this->render('notfound');
}
}
It works well except one thing: it provides very strict search. I need to get back all companies that have Carbrand A and also all companies that have Good B.
If I specify required conditions in my search form, Cake will generate the following SQL:
SELECT DISTINCT `Company`.`id`, `Company`.`name`, `Company`.`addr`, `Company`.`official` FROM `autov`.`companies` AS `Company`
INNER JOIN `autov`.`carbrands_companies` AS `CarbrandsCompany` ON (`CarbrandsCompany`.`carbrand_id` = ('23') AND `CarbrandsCompany`.`company_id` = `Company`.`id`)
INNER JOIN `autov`.`companies_goods` AS `GoodsCompany` ON (`GoodsCompany`.`good_id` = ('1') AND `GoodsCompany`.`company_id` = `Company`.`id`)
WHERE 1 = 1 ORDER BY `Company`.`name` asc
LIMIT 10
And obviously 0 results from database . As far as I can understand this is because my function is very strict and Cake looks for Company which have Carbrand A AND have Good B at the same time.
But this is not what I need.
The following query fetches desired results:
SELECT DISTINCT `Company`.`id`, `Company`.`name`, `Company`.`addr`, `Company`.`official`
FROM `auto`.`companies` AS `Company`
INNER JOIN `auto`.`carbrands_companies` AS `CarbrandsCompany` ON
(`CarbrandsCompany`.`carbrand_id` = ('23') AND `CarbrandsCompany`.`company_id` = `Company`.`id`)
UNION
SELECT DISTINCT `Company`.`id`, `Company`.`name`, `Company`.`addr`, `Company`.`official` FROM `auto`.`companies` AS `Company`
INNER JOIN `auto`.`companies_goods` AS `GoodsCompany` ON (`GoodsCompany`.`good_id` = ('1') AND `GoodsCompany`.`company_id` = `Company`.`id`)
WHERE 1 = 1
LIMIT 100
How do I change my function to get desired SQL query generated by CakePHP?