Запрос DQL с ассоциациями?

Я работаю над веб-приложением, в котором есть три объекта: пользователь, проект и задача.

Каждая задача имеет отношение «многие к одному» с проектами. Todos также имеют отношения «многие ко многим» с пользователями.

Что я пытаюсь сделать, так это получить проекты, содержащие задачу, назначенную данному пользователю.

Мой код выглядит следующим образом. $id был установлен на user_id, для которого я хочу получить проекты

$em = $this->getDoctrine()->getEntityManager();
$projects = $em->createQuery("SELECT p FROM projects p INNER JOIN p.todos t WITH t.assigned_to = :id")
    ->setParameter('id', $id)
    ->getResult();

Всякий раз, когда я запускаю этот запрос, я получаю следующую ошибку:

[Семантическая ошибка] строка 0, столбец 79 рядом с «assigned_to =»: Ошибка: недопустимое выражение пути. Ожидается StateFieldPathExpression или SingleValuedAssociationField.

Любые мысли о том, что я делаю неправильно? Спасибо.


person James Kirkwood    schedule 11.10.2011    source источник


Ответы (1)


Обновлено:

Поскольку отношениеassign_to представляет собой отношение многие ко многим, указанное в комментариях, фактического поляassign_to для сравнения нет.

Вам необходимо вступить в ассоциацию:

SELECT p 
FROM projects p 
INNER JOIN p.todos t 
INNER JOIN t.assigned_to a
WHERE a.id = :id

Я использую условие WHERE, к которому я привык, как я узнал от вас, WITH также поддерживается и может работать;)

person Max    schedule 11.10.2011
comment
Я почти уверен, что предложение WITH поддерживается. Его можно найти в одном из примеров Doctrine, перечисленных здесь. И когда я заменяю WITH t.assigned_to = :id" условием, которое не использует внешний ключ (например, WITH t.description = 'Say hi'"), запрос работает нормально. - person James Kirkwood; 11.10.2011
comment
Кроме того, я попытался использовать предложение WHERE и столкнулся с теми же проблемами. - person James Kirkwood; 11.10.2011
comment
@JamesKirkwood хм… каково ваше сопоставление сassign_to? это набор из нескольких значений или одно значение? - person Max; 11.10.2011
comment
assign_to может быть сопоставлен с несколькими пользователями, это отношение «многие ко многим». - person James Kirkwood; 11.10.2011
comment
@JamesKirkwood спасибо за разъяснения, я обновил свой ответ, попробуйте - person Max; 11.10.2011