У меня есть три объекта: « 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!