У меня есть три объекта: « User , « Answer и « Question .
Существует связь OneToMany между User и Answer и отношение ManyToOne между Answer и Question . В принципе, конкретный пользователь, возможно, дает ответы на кучу вопросов.
То, что я пытаюсь выполнить в мире ORM, – это получение ВСЕХ вопросов и связанных с ними ответов для конкретного пользователя. Основная часть заключается в том, что пользователь, возможно, не ответил на конкретный вопрос, но я все еще хочу получить этот вопрос (с нулевым ответом).
Answer Мой Answer имеет поле «пользователь», которое сопоставляется с объектом « User который инвертируется полем «ответы» внутри объекта « User . Если я использую это поле «ответы» внутри объекта User , я получаю только пары вопросов / ответов, на которые пользователь ответил. У меня нет вопросов, на которые пользователь не ответил.
Как правило, используя необработанный SQL, это связано с простым «левым внешним соединением» между моей таблицей вопросов и ответов, но я хочу, чтобы это было сделано с помощью ORM от Doctrine. Какие-либо предложения? Я довольно новичок в мире ORM.
Я сделал это! Вот как:
Я создал поле в своем объекте Question которое содержит все ответы от всех пользователей по этому конкретному вопросу; его сопоставлено с отношением OneToMany к объекту Answer . И затем, чтобы убедиться, что мы ограничиваем этот список ответами для конкретного пользователя, я создал специальный репозиторий для объекта Question и создал следующую функцию:
public function findAllJoinedToAnswer($user) { $query = $this->getEntityManager() ->createQuery(' SELECT q, a FROM Bundle:Question q LEFT JOIN q.answers a WITH a.user = :user' )->setParameter('user', $user); try{ return $query->getResult(); }catch (\Doctrine\ORM\NoResultException $e) { return null; } }
Просто передайте экземпляр объекта User и voila!