7

这些模型是: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..>))返回该类型的数据?

4

5 回答 5

17

一种方法是在关联中使用 Cake 的内置counterCache选项。这可能是性能最高的选项,尽管它确实需要向您的表中添加一个字段。

在您的stores表中,添加一个INT名为product_count

在您的Product模型中,将counterCache选项添加到您的关联中:

var $belongsTo = array(
    'Store' => array(
    'className' => 'Store',
    'foreignKey' => 'store_id',
    'counterCache' => true
 ));

每当您添加或删除Product记录时,它会自动更新product_count关联Store记录的字段,因此无需更改您的find操作。

请注意,如果您选择此路线,则需要手动更新该product_count字段以使初始值正确,因为它仅在添加/删除操作后更新。

于 2011-11-17T23:18:23.360 回答
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'),
));
于 2011-11-17T22:30:32.773 回答
2

退房find('count')

但是,如果您希望将此数据与存储数据配对,这可能无法很好地扩展(请参阅therealtomrose的答案)。

我在使用find('count')和分组数据时遇到了麻烦。不幸的是,这是框架为您编写查询失败的边缘情况之一。

于 2011-11-17T21:36:34.700 回答
2

在 CakePHP 2.0 之后,您还可以为您的计数和每个模型的多个计数器添加条件

将任何整数字段添加到您的Store然后在您的Product模型中使用它:

var $belongsTo = array(
    'Store' => array(
        'className' => 'Store',
        'foreignKey' => 'store_id',
        'counterCache' => array(
            'anyfield', array('Product.id >' => 0),
            'stock' => array('Product.status' => 'stock')
        )
    )
);
于 2013-06-02T10:35:51.387 回答
1

一个简单的 find all 将获取您需要的数据:

$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 条左右的记录,您可能需要考虑将其配对,但它会复杂得多。
于 2011-11-17T21:32:35.303 回答