模型为:stores
和product
,它们通过以下方式关联:
var $belongsTo = array(
'Store' => array(
'className' => 'Store',
'foreignKey' => 'store_id'
))
var $hasMany = array(
'Product' => array(
'className' => 'Product',
'foreignKey' => 'store_id'
))
我想获得所有商店的清单以及他们拥有的产品数量。我该如何修改调用:$this->Store->find('all', array(<..some conditions..>))
以返回该类型的数据?
答案 0 :(得分:17)
一种方法是在关联中使用Cake的内置counterCache
选项。这可能是性能最高的选项,但它确实需要在表中添加一个字段。
在stores
表格中,添加名为INT
的{{1}}字段
在您的product_count
模型中,为您的关联添加Product
选项:
counterCache
每当您添加或删除var $belongsTo = array(
'Store' => array(
'className' => 'Store',
'foreignKey' => 'store_id',
'counterCache' => true
));
条记录时,它都会自动更新相关Product
记录的product_count
字段,因此无需更改Store
条记录操作
请注意,如果选择此路线,则需要手动更新find
字段以使初始值正确,因为它仅在添加/删除操作后更新。
答案 1 :(得分:3)
我相信以下内容可行,但我无法从此处测试。 COUNT()
内容可能需要调整以处理Cake如何构造其查询。
$this->Store->virtualFields = array('product_count' => 'COUNT(Product.id)');
$this->Store->find('all', array(
'fields' => array('Store.id', 'Store.product_count'),
'group' => array('Store.id'),
));
答案 2 :(得分:2)
但是,如果您希望将此数据与商店数据配对<(请参阅 therealtomrose 的答案),这可能无法很好地扩展。
我在使用find('count')
和分组数据方面遇到了麻烦。不幸的是,这是为您编写查询的框架失败的边缘情况之一。
答案 3 :(得分:2)
在CakePHP 2.0之后,您还可以将conditions添加到您的点数和multiple counters per model。
向Store
添加任何整数字段,然后在Product
模型中使用此字段:
var $belongsTo = array(
'Store' => array(
'className' => 'Store',
'foreignKey' => 'store_id',
'counterCache' => array(
'anyfield', array('Product.id >' => 0),
'stock' => array('Product.status' => 'stock')
)
)
);
答案 4 :(得分:1)
一个简单的查找全部将获取您需要的数据:
$Stores = $this->Store->find('all');
可以使用以下代码返回其中一个商店的产品数量,其中“0”可以替换为商店数组索引的编号:
count($Stores[0]['Products']); //returns an integer
如果您想要每个商店的产品数量,您可以考虑循环所有商店:
foreach ($Stores as $Store) {
echo count($Store['Products']);
}
我正在做的假设: