質問

次の関係が設定されています:

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を記述することが、実際には最もクリーンな方法かもしれません。

編集:

または、再バインドすることもできます多くの場合、AとBの結合テーブル/モデルを使用して関係を作成します。これにより、関連するモデルの条件をより簡単に使用できるようになりますが、Cを取得するのは依然として難しいです。条件がAの場合。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top