В настоящее время я пытаюсь реализовать функцию поисковой системы на моем сайте CakePHP, пытаясь эффективно получать информацию из 3 таблиц. Основное использование будет числовым поиском, свободный текст будет крайне минимальным, и поэтому я не пытаюсь оптимизировать этот сценарий.
Companies hasMany Products Products hasMany Prices
В идеале я хотел бы использовать в контроллере Products что-то вроде следующей функции (это не будет работать из-за отдаленных отношений):
$results = $this->Product->find('all', array( //conditions can be defined against all 3 tables 'conditions' =>. array( 'company.name LIKE' => '%'.$search_term.'%', 'product.feature' => $product_feature, 'price.price <' => $price ), //fields restricted against all 3 tables 'fields' => array( 'company.name', 'product.feature', 'price.price' ) ));
Я попытался использовать Containable поведение, чтобы включить три модели, но безрезультатно.
Я считаю, что решение лежит в JOINS, но мой опыт с ними ограничен, я пробовал код, похожий на следующий в функции поиска выше:
'joins' => array( array( 'table' => 'companies', 'alias' => 'Company', //tried a mix of joins (LEFT, RIGHT, INNER) 'type' => 'LEFT', 'conditions' => array( 'Company.id = Product.company_id' ) ), array( 'table' => 'prices', 'alias' => 'Price', //tried a mix of joins (LEFT, RIGHT, INNER) 'type' => 'LEFT', 'conditions' => array( 'Price.product_id = Product.id' ) ), ), 'recursive' => 1,
Изменить: результат приведенных выше объединений заключается в том, что, когда я указываю цену в условиях или полях, которые не могут быть найдены, я попытался изменить имена, такие как Product.Price.price, чтобы учесть отношение одного ко многим, но все же без везения.
Я был бы признателен за любую помощь в поиске решения!