DQL заявка с асоциации?

Работя върху уеб приложение, което има три обекта: потребител, проект и задачи.

Всеки Todo има връзка много към едно с Projects. 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 =“: Грешка: Невалиден PathExpression. Очаква се StateFieldPathExpression или SingleValuedAssociationField.

Някакви мисли какво правя погрешно? Благодаря.


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


Отговори (1)


Актуализирано:

Тъй като връзката assigned_to е връзка много към много, посочена в коментарите, няма действително поле assigned_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 хм… какво е твоето картографиране на assigned_to? това колекция от множество стойности ли е или една стойност? - person Max; 11.10.2011
comment
assigned_to може да бъде нанесен на няколко потребители, това е връзка много към много. - person James Kirkwood; 11.10.2011
comment
@JamesKirkwood благодаря за пояснението, актуализирах отговора си, опитайте - person Max; 11.10.2011