CakePHPの第3レベルの関係に基づいてデータをクエリする
-
06-07-2019 - |
質問
次の関係が設定されています:
A HABTM B
B belongsTo C
C hasMany B
今、与えられたAに対して、すべてのCにBが接続されている必要があります。 SQLクエリを記述できますが、適切なCakePHPの方法は何ですか?どのモデルで、どのパラメーターでどのメソッドを呼び出すのですか?
解決
Azizの答えに行き、データが入ってくると単純に処理します。ただし、Cをプライマリモデルにする必要がある場合は、少し回避策を講じる必要があります。 Cakeは、関連するモデル、特に削除された第3のいとこ類のクエリの条件に関しては、まだあまり良くありません。通常、belongsToまたは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を記述することが、実際には最もクリーンな方法かもしれません。
編集:
他のヒント
$this->A->find(
'first',
array('conditions'=>array('id'=>'someword'),
'recursive'=>2)
);
こんな感じ?
これは動作する可能性があります
$this->C->find('all',
array('conditions'=>array('id'=>'someword','B.aid'=>$a.id)));
「Containable」を思い浮かべます動作( http://book.cakephp.org/view/474/Containable ) ...関連データの検索を大幅に制御できます。
所属していません StackOverflow