在Cakephp中选择至少有一个hasMany关系行的记录

时间:2014-10-19 14:03:50

标签: cakephp associations model-associations

我在模特中遇到了cakephp协会的问题。

我必须选择至少有一个hasMany reation行的记录

模型

class Category extends AppModel 
{  
    public $hasMany = array(
             'Product' => array(         
             'className' => 'Product',
             'foreignKey' => 'CategoryId',                
             )              
        );
    }

查询

$categories = $this->Category->find('all');

我只需要至少包含一个产品条目的类别

分类如:衬衫,鞋类,眼镜等

产品如:

小,中,大(衬衫) 带框架,防紫外线(玻璃)

所以,我想要获得衬衫和眼镜类别只是因为上面的例子没有鞋类产品

1 个答案:

答案 0 :(得分:3)

使用counterCache或加入

请参阅 CakePHP - Find and count how many associated records exist

具有最佳性能的最简单方法是使用正确索引的计数器缓存字段,如链接答案中所示。

链接的答案与联接不完全相同,这里有一些额外的信息,而不是HAVING COUNT与您使用IS NOT NULL条件的联接。这是一个(未经测试的)示例:

$this->Category->find('all', array(
    'joins' => array(
        array(
            'table' => 'products',
            'alias' => 'Product',
            'type' => 'LEFT',
            'conditions' => array('Category.id = Product.CategoryId')
        )
    ),
    'conditions' => array(
        'Product.CategoryId IS NOT NULL'
    )
    'group' => 'Category.id'
));

根据使用的DBMS和版本,您可以使用内部联接获得更好的性能:

$this->Category->find('all', array(
    'joins' => array(
        array(
            'table' => 'products',
            'alias' => 'Product',
            'type' => 'INNER',
            'conditions' => array('Category.id = Product.CategoryId')
        )
    ),
    'group' => 'Category.id'
));