4

私は以下のモデルを持っています。

  1. 業種(ID、名前)
  2. Movie(id, name, industry_id) [映画が多い業界]
  3. Trailer(id, name, movie_id) [映画にはたくさんの予告編があります]

それぞれの 6 つの最新予告編を見つける必要がありますIndustry。すべての映画に予告編が必要なわけではなく、複数の [0-n] を持つことができます。

結果には、少なくとも 1 つの予告編を含む映画の配列が含まれている必要があります。

$this->Industry->find('all', array(
    'contain' => array(
        'Movie' => array(
            'Trailer' => array(
                'limit' => 1
            ),
            'order' => 'Movie.release DESC',
            'limit' => 6
        )
    ),
    'order' => 'Industry.name ASC'
));
4

1 に答える 1

10

オプション 1 (最適なオプション IMO):

あなたは正しい道を歩んでいました - 今必要なのはCakePHP の CouterCacheを追加することだけです。

基本的に、関連付けを設定'counterCache' => true$belongsTo、フィールドを追加しsingularModel_countます(あなたの場合、テーブルtrailer_countのフィールドになりmoviesます)。次に、そのフィールドに対して条件を付けることができます (以下の変更されたコードを参照)。

CakePHP の CounterCache は、CakePHP メソッドを介して何かが追加/削除されるたびに追加/減算することにより、アイテムの数を自動的に追跡します。

$this->Industry->find('all', array(
    'contain' => array(
        'Movie' => array(
            'conditions' => array(
                'Movie.trailer_count >' => 0  // <-- Notice this addition
            ),
            'order' => 'Movie.release DESC',
            'limit' => 6,
            'Trailer' => array(
                'limit' => 1
            ),
        )
    ),
    'order' => 'Industry.name ASC'
));

オプション 2:

もう 1 つのオプションは、JOIN を使用することです ( CakePHP JOINを参照)。CakePHP が「contain()」によって呼び出された各モデルにクエリを実行するとき、実際には個別のクエリを実行し、データを結合してから返します。そのため、子モデルに対する条件に基づいて親モデルを制限することはできません。これらは実際には個別のクエリであり、MySQL は条件で参照しようとしているテーブルを認識できないためです。

オプション 2 の欠点は、Movie と Trailer の間で (おそらく) INNER JOIN を実行するため、複数の予告編を返すなどの操作が困難になることです。

于 2013-01-02T14:19:51.007 に答える