2011-11-17 97 views
7

型號有:storesproduct,它們通過相關:cakePHP - 我如何獲得相關模型的物品計數?

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..>))以返回該類型的數據?

+1

的CakePHP的哪個版本? –

+0

蛋糕v1.3 ....... – yossi

回答

16

一種方法是在您的關聯中使用Cake的內置counterCache選項。這可能是性能最高的選項,但它確實需要在表中添加一個字段。

在你stores表中,添加一個INT場稱爲product_count

在你Product模型counterCache選項添加到您的關聯關係:

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

無論何時添加或刪除Product記錄,它會自動更新相關Store記錄的product_count領域,所以沒有必要改變你的find操作。

請注意,如果您選擇此路由,則需要手動更新product_count字段以確保初始值正確,因爲它僅在添加/刪除操作後更新。

+2

+1教給我的東西:) –

+0

這是否默認烘烤表時工作? – Dooltaz

1

一個簡單的找到所有將獲取你需要的數據:

$Stores = $this->Store->find('all'); 

的產品在賣場的一個計數可以用下面的代碼,「0」可以用的數量來代替被退回店裏的數組索引:

count($Stores[0]['Products']); //returns an integer 

如果你想在每家商店的產品數量,你可以考慮這樣遍歷所有的商店:

foreach ($Stores as $Store) { 
    echo count($Store['Products']); 
} 

假設我提出:

  1. 你想要的產品的數量在每家商店,而不是產品的整體數量。
  2. 你不太關心性能。如果你有超過5萬條記錄,你可能想考慮把它重新配對,但它會複雜得多。
2

退房find('count')

然而,這可能不會很好地擴展,如果你想找這個數據與存儲數據(見therealtomrose答案)。

我在使用find('count')和分組數據時遇到了問題。不幸的是,這是這些邊緣的情況下爲你失敗,其中構架編寫查詢之一。

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

在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') 
     ) 
    ) 
);