2011-11-17 3 views
7

のモデルがあり、私はすべての店舗のリストと、彼らが持っている製品の数を取得したいcakePHP - 関連するモデルのアイテム数を取得するにはどうすればよいですか? <code>stores</code>と<code>product</code>、およびそれらがによって関連付けられています:

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」の数に置き換えることができ、次のコードを返すことができ

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

+1

CakePHPのバージョン:

は、あなたのProductモデルでこれを使用し、あなたのStoreに任意の整数フィールドを追加しますか? –

+0

ケーキv1.3 ....... – yossi

答えて

16

1つの方法は、ケーキの組み込みのcounterCacheオプションを使用することです。おそらく最もパフォーマンスの高いオプションですが、テーブルにフィールドを追加する必要があります。あなたのstoresテーブルで

INTフィールドを追加するには、あなたの協会にcounterCacheオプションを追加するには、Productモデルでproduct_count

と呼ば:

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

あなたがProductレコードを追加または削除するたびに、それが自動的に更新されます関連付けられたStoreレコードのproduct_countフィールドを使用して、findオペレーションを変更する必要はありません。

このルートを選択した場合、追加/削除操作後にのみ更新されるため、初期値が正しいように手動でproduct_countフィールドを手動で更新する必要があります。

+2

+1教えるために:) –

+0

テーブルをベーキングするときにこれはデフォルトで機能しますか? – Dooltaz

1

簡単な検索すべてはあなたが必要とするデータをフェッチします店舗の配列インデックス:

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

あなたは、各店舗での製品のカウントをしたい場合、あなたはこのようにすべての店舗を超えるループ検討することができます:

foreach ($Stores as $Store) { 
    echo count($Store['Products']); 
} 
私が作っています3210の

仮定:

  1. あなたは、製品が全体的にカウントされない、各店舗での製品のカウントをしたいです。
  2. あなたはパフォーマンスにあまり関心がありません。 50,000以上のレコードがある場合は、これをペアにすることを検討したいかもしれませんが、かなり複雑になります。
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を追加することもできます。

var $belongsTo = array(
    'Store' => array(
     'className' => 'Store', 
     'foreignKey' => 'store_id', 
     'counterCache' => array(
      'anyfield', array('Product.id >' => 0), 
      'stock' => array('Product.status' => 'stock') 
     ) 
    ) 
); 
関連する問題