запрос доктрины для связанных отношений один ко многим - PullRequest
2 голосов
/ 04 августа 2010

У меня есть три таблицы A, B, C. A и B имеют отношение один ко многим. У B и C есть еще одно-много-отношение. Другими словами, каждый A может иметь несколько B, в то время как каждый B может иметь несколько C.

Теперь я хочу сделать запрос для данной записи A, чтобы получить все связанные B, которые имеют связанные C. Другими словами, для данного a, который является записью в таблице A, я хочу получить все связанные B из таблицы B, при условии, что каждый из B также имеет больше нуля связанных C в таблице C.

Как написать утверждение в доктрине PHP? У меня есть код, который не работает:

Doctrine_Query :: create () -> from ('B b') -> leftJoin ('C c') -> andWhere ('b.A_id =?', a.id) -> andWhere ('c.b_id = b.id');

Ответы [ 3 ]

0 голосов
/ 05 августа 2010

Как уже было указано, вам нужно написать как минимум 2 запроса. Я также сделал бы так, как он предложил (возьмите все идентификаторы B и используйте IN).

Чтобы сделать его более подходящим для доктрины, посмотрите на DQL Subqueries . Они уже показывают пример, который использует IN в связи с выбором идентификаторов.

edit : Читая ответ DuoSRX, я думаю, вы, возможно, имели в виду то, что он показывает с Inner Joins, но не совсем уверены, правильно ли я понял вопрос.

0 голосов
/ 05 августа 2010

Почему бы вам просто не использовать innerJoin?

С Foo, Bar и Baz (соответственно A, B и C):

Doctrine_Query::create()
->from('Bar bar')
->where('bar.foo_id = ?', $foo->id)
->innerJoin('bar.Baz baz');

Таким образом, вы получите толькоБар, принадлежащий Foo и имеющий один или несколько баз.

0 голосов
/ 04 августа 2010

Из моей работы с Доктриной это невозможно (Доктрина 1 - это то, о чем я говорю).

Обходной путь, который, как я знаю, отстой, заключается в выполнении нескольких запросов. IE берет все идентификаторы B и использует их в предложении whereIN и выводит их в отдельном запросе. Если у кого-то есть лучший метод, я бы заинтересовался им:)

...