我目前正在尝试在CakePHP网站中实现搜索引擎功能,尝试有效地从3个表中返回信息。主要用途是数字搜索,自由文本将极少,因此我不会尝试优化此方案。
Companies hasMany Products
Products hasMany Prices
理想情况下,我希望能够在产品控制器中使用类似以下功能的东西(由于远距离关系而无法工作):
$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'
)
));
我尝试使用可包含的行为来包含这三个模型但无济于事。
我相信解决方案在于JOINS,但我对这些的经验是有限的,我在上面的find函数中尝试过与以下类似的代码:
'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以考虑一个许多关系,但仍然没有运气。
我很感激找到解决方案的任何帮助!
答案 0 :(得分:2)
我更喜欢代码与蛋糕模型/表命名约定(db table products
- 模型名称Product
,db table prices
- 模型名称{{ 1}})进一步的项目管理。它看起来像你想要做的:
Price
但如果您希望产品 所有条件(公司和价格)仅,您应使用$results = $this->Product->find('all', array(
'fields' => array(
'Company.name',
'Product.feature',
'Price.price'
),
'joins' => array(
'LEFT JOIN companies AS Company ON Product.company_id = Company.id
LEFT JOIN prices AS Price ON Product.id = Price.product_id'
),
'conditions' => array(
'Company.name LIKE' => '%'.$search_term.'%',
'Product.feature' => $product_feature,
'Price.price <' => $price
),
));
和INNER JOIN
产品(GROUP BY
选项)。
此外,如果您希望获得具有许多价格和公司结果的所有产品,并且您设置/链接模型关系,则可以使用group
选项,例如:
contain
因此,您将获得$contain = array(
'Company' => array(
// ...
'conditions' => array('Company.name LIKE' => '%'.$search_term.'%'),
// ...
),
'Price' => array(
// you can set: 'fields' => array('id', ...),
'conditions' => array('Price.price <' => $price),
// you can set order: 'ordder' => '....'
)
);
$this->Product->attach('Containable');
$post = $this->Product->find('all', array(
// ...
'contain' => $contain,
'conditions' => array('Product.feature' => $product_feature),
// ...
));
的所有产品,并且您可以获得feature => $product_feautre
公司和此产品的价格。
希望这有帮助。