Используйте ассоциативную таблицу Doctrine в запросе DQL или эквиваленте

(Наверное, решение моей проблемы простое, но я искал больше часа и так ничего и не нашел.)

У меня есть два объекта, X и Y, с двунаправленными отношениями между ними. Для объекта X я бы сделал что-то вроде anXObject->getY(), чтобы получить все объекты Y, связанные с объектом XObject.

Как я могу получить только (возможно, отсортированное) подмножество объектов, возвращенных предыдущим оператором (возможно, с помощью оператора DQL или какого-либо другого механизма, специфичного для Doctrine)?

Я мог бы сделать это с помощью SQL, используя ассоциативную таблицу X_Y, созданную Doctrine, но мне любопытно, можно ли это сделать только с помощью DQL. (Насколько я понимаю, к этой таблице ассоциаций нельзя получить доступ из DQL.)


Обновлять:

Вот мои объекты (для краткости я удалил ненужные вещи): http://paste.pocoo.org/show/512177/

Чтобы уточнить, что я хочу сделать, это получить все объекты Serial, которые имеют определенный тег.


person lemon24    schedule 24.11.2011    source источник
comment
Думаю, я понимаю, что вы имеете в виду... но можете ли вы опубликовать свой код, чтобы мы могли дать вам более явный пример, основанный на ваших объектах?   -  person Darragh Enright    schedule 24.11.2011
comment
Я обновил свой вопрос некоторыми примерами объектов.   -  person lemon24    schedule 24.11.2011


Ответы (1)


Вы используете yml — я знаком с аннотациями. Я думаю, что это правильно, хотя.

В первую очередь стоит прочитать это:

http://www.doctrine-project.org/docs/orm/2.1/en/reference/association-mapping.html#picking-owning-and-inverse-side

Вам нужно явно установить отношения между двумя объектами, это то, что я забыл сделать пару раз.

Предполагая, что все отношения установлены правильно и fks записаны в таблицу соединения, вы сможете выполнить некоторые дополнительные действия с вашим DQL:

$query = $em->createQuery('
    SELECT s, t 
    FROM FooBarBundle:Serial s 
    JOIN s.tags t 
    WHERE t.name = "baz" 
    ORDER BY t.id ASC
');

Обратите внимание, что псевдоним для tags находится в списке полей; Я полагаю, что это называется объединением выборки?

В любом случае, по моему опыту, важно убедиться, что отношения сохраняются в таблице соединений.

Надеюсь это поможет :)

person Darragh Enright    schedule 24.11.2011
comment
Это сработало отлично. Большое спасибо! (тоже не знала, что это так называется). - person lemon24; 24.11.2011
comment
Так и должно было быть: сработало отлично. Большое спасибо! Я не знал, что вы можете сделать это - объединение с коллекцией (тоже не знал, как это называется). - person lemon24; 24.11.2011