次の関係を設定しています。
A HABTM B
B belongsTo C
C hasMany B
ここで、特定の A に対して、B が付加されたすべての C が必要です。私は SQL クエリを書くことができますが、適切な CakePHP の方法は何ですか? どのモデルで、どのパラメーターを使用してどのメソッドを呼び出すか?
次の関係を設定しています。
A HABTM B
B belongsTo C
C hasMany B
ここで、特定の A に対して、B が付加されたすべての C が必要です。私は SQL クエリを書くことができますが、適切な CakePHP の方法は何ですか? どのモデルで、どのパラメーターを使用してどのメソッドを呼び出すか?
これはうまくいくかもしれません
$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));
「収容可能な」動作(http://book.cakephp.org/view/474/Containable)について考えます...関連データの検索を大幅に制御できます。
私は Aziz の回答を使用し、データが入ってくると単純に処理します。ただし、C をプライマリ モデルにする必要がある場合は、少し回避策を講じる必要があります。Cake は、関連するモデルの条件、特に削除された 3rd Cousins のようなクエリではまだあまり良くありません。通常は、begsTo または hasMany リレーションに対して実際の JOIN クエリのみを実行します。ただし、HABTM リレーションではなく、別のクエリで取得するものです。つまり、関連する HABTM モデルに条件を含めることはできません。
あなたの最善の策は、次のようなものかもしれません:
// get related records as usual with the condition on A, limit to as little data as necessary
$ids = $this->A->find('first', array(
'conditions' => array('A.id' => 'something'),
'recursive' => 2,
'fields' => array('A.id'),
'contain' => array('B.id', 'B.c_id', 'B.C.id') // not quite sure if B.C.id works, maybe go with B.C instead
));
// find Cs, using the ids we got before as the condition
$Cs = $this->C->find('all', array(
'conditions' => array('C.id' => Set::extract('/B/C/id', $ids)),
'recursive => 1
);
これはかなりの数のクエリを生成するため、実際には最適なソリューションではないことに注意してください。独自の SQL を作成するのが、実際には最もクリーンな方法かもしれません。
編集:
または、関連付けをオンザフライで再バインドして hasMany/belongsTo 関係にすることもできます。おそらく A と B の結合テーブル/モデルを使用します。これにより、関連するモデルの条件をより簡単に使用できるようになる可能性がありますが、それでも注意が必要です。条件が A の場合に C を取得します。
$this->A->find(
'first',
array('conditions'=>array('id'=>'someword'),
'recursive'=>2)
);
このような?