CakePHP - 使用JOIN高效搜索3个表

时间:2014-03-20 10:26:42

标签: php mysql cakephp join

我目前正在尝试在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以考虑一个许多关系,但仍然没有运气。

我很感激找到解决方案的任何帮助!

1 个答案:

答案 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公司和此产品的价格。

希望这有帮助。