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

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

テーブルに、というフィールドstoresを追加しますINTproduct_count

ProductモデルcounterCacheで、関連付けにオプションを追加します。

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

レコードを追加または削除するたびに、関連付けられたレコードのフィールドProductが自動的に更新されるため、操作を変更する必要はありません。product_countStorefind

このルートを選択した場合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')データの使用とグループ化に問題がありました。残念ながら、これは、クエリを作成するフレームワークが失敗するエッジケースの1つです。

于 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

単純なすべての検索で、必要なデータがフェッチされます。

$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 に答える