CakePHP:如何使用hasMany关联中的条件筛选父模型中的结果

时间:2013-12-31 06:44:01

标签: php cakephp model cakephp-2.4

CakePHP:2.4.3

我尝试按照以下问题的答案中的说明进行操作,但它仅在子模型中应用条件。 (Find conditions with hasMany model

我希望能够仅提取具有ProductsCategory.category_id的产品,例如,2。现在它只过滤相关模型并仍然返回我的所有产品。

修改: 没有第一次提到它,但我希望能够有多种条件。 ProductsCategory.category_id == 2 AND ProductsTag.tag_id == 1.

我有这些模特: 产品,类别和标签

产品hasMany ProductsCategory和ProductsTag

ProductsCategory和ProductsTag如下:

ProductsCategory

product_id (fk) | category_id (fk)

ProductsTag

product_id (fk) | tag_id (fk)

型号/ Product.php (已编辑以包含Rikesh的建议)

class Product extends AppModel {
public $primaryKey = 'product_id';

public $actsAs = array('Containable');

public $belongsTo = 'Supplier';
public $hasMany = array(
    'ProductsCategory' => array(
        'className' => 'ProductsCategory',
        'foreignKey' => 'category_id',
        'dependent' => true),
    'ProductsTag' => array(
        'className' => 'ProductsTag',
        'foreignKey' => 'tag_id',
        'dependant' => true
    ));

这是我到目前为止所尝试的内容:

$this->Product->find('all',
            array(
                'recursive' => -1,
                'contain' => array(
                    'ProductsCategory' => array(
                        'conditions' => array(
                            'ProductsCategory.category_id' => 2)
                        )
                    )
                )
            )

$this->Product->find('all',
            array(
                'joins' => array(
                    array(
                        'table' => 'products_categories',
                        'alias' => 'ProductsCategory',
                        'type' => 'inner',
                        'conditions' => array('ProductsCategory.category_id' => 2)
                    )
                )
            )
        )

2 个答案:

答案 0 :(得分:0)

因为ProductsCategory属于产品,你可以找到产品类别,让蛋糕加入产品

$this->Product->ProductsCategory->find(
    'all',
    array(
        'conditions' => array(
            'ProductsCategory.category_id' => 2,
            'ProductsTag.tag_id' => 1
    ),
        'contain' => array('Product', 'Product.ProductTag'),
        'group' => 'ProductsCategory.product_id'
    )
)

答案 1 :(得分:0)

我设法通过在我的连接条件中添加ProductsCategory.product_id = Product.product_id来做我想要的事情:

$this->Product->find('all', array(
                'joins' => array(
                    array(
                        'table' => 'products_categories',
                        'alias' => 'ProductsCategory',
                        'type' => 'inner',
                        'conditions' => array(
                            'ProductsCategory.product_id = Product.product_id',
                            'ProductsCategory.category_id' => array(2, 3), 
                        )
                    ),
                    array(
                        'table' => 'products_tags',
                        'alias' => 'ProductsTag',
                        'type' => 'inner',
                        'conditions' => array(
                            'ProductsTag.product_id = Product.product_id',
                            'ProductsTag.tag_id' => 1
                        )
                    )
                )
            )
        )