cakePHP - 如何获取相关模型的项目数?

时间:2011-11-17 20:39:43

标签: cakephp count model-associations

模型为:storesproduct,它们通过以下方式关联:

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..>))以返回该类型的数据?

5 个答案:

答案 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)

查看find('count')

但是,如果您希望将此数据与商店数据配对<(请参阅 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']);
}

我正在做的假设:

  1. 您想要每个商店的产品数量,而不是整体产品数量。
  2. 你不太关心表现。如果您有超过50,000条记录,您可能需要考虑将其配对,但这会更复杂。