モデルのいくつかが hasMany/belongsTo 関連付けによってリンクされているアプリがあります。したがって、たとえば、A は B が多く、B は C が多く、C は多くが D であり、D は E が多くあります。また、E は D に属し、D は C に属し、C は B に属し、B は A に属します。各クエリで返される情報量を制御するのに最適ですが、テーブル D を含む条件を使用しているときにテーブル A からデータを取得しようとすると問題が発生するようです。たとえば、ここに私の 'A' の例を示します。モデル:
class A extends AppModel {
var $name = 'A';
var $hasMany = array(
'B' => array('dependent' => true)
);
function findDependentOnE($condition) {
return $this->find('all', array(
'contain' => array(
'B' => array(
'C' => array(
'D' => array(
'E' => array(
'conditions' => array(
'E.myfield' => $some_value
)
)
)
)
)
)
));
}
}
これでも「A」のすべてのレコードが返されます。関連する「E」レコードが条件を満たさない場合は、次のようになります。
Array(
[0] => array(
[A] => array(
[field1] => // stuff
[field2] => // more stuff
// ...etc
),
[B] => array(
[field1] => // stuff
[field2] => // more stuff
// ...etc
),
[C] => array(
[field1] => // stuff
[field2] => // more stuff
// ...etc
),
[D] => array(
[field1] => // stuff
[field2] => // more stuff
// ...etc
),
[E] => array(
// empty if 'E.myfield' != $some_value'
)
),
[1] => array( // ...etc )
)
If 'E.myfield' != $some_value の場合、レコードを返してほしくありません。
これが私の問題を十分に明確に表現していることを願っています...
基本的に、次のクエリが必要ですが、データベースに依存しない/CakePHP-y のような方法で:
SELECT *
FROM A INNER JOIN
(B INNER JOIN
(C INNER JOIN
(D INNER JOIN
E ON D.id=E.d_id)
ON C.id=D.c_id)
ON B.id=C.b_id)
ON A.id=B.a_id
WHERE E.myfield = $some_value