Symfony - Использование внешних объединений с доктриной ORM - PullRequest
1 голос
/ 11 марта 2012

У меня есть три объекта: User, Answer и Question.

Существует отношение OneToMany между User и Answer и отношение ManyToOne между Answer и Question.По сути, конкретный пользователь может дать ответы на несколько вопросов.

В мире ORM я пытаюсь найти ВСЕ вопросы и связанные с ними ответы для конкретного пользователя.Ключевым моментом является то, что пользователь, возможно, не ответил на конкретный вопрос, но я все еще хочу получить этот вопрос (с нулевым ответом).

Моя Answer сущность имеет поле 'user', которое отображается наUser сущность, которая инвертируется полем «ответы» внутри User сущности.Если я использую это поле «ответы» внутри объекта User, я получу только те пары вопросов / ответов, на которые пользователь фактически ответил.Я не получаю вопросы, на которые пользователь получил , а не ответ.

Как правило, при использовании необработанного SQL это включало бы простое «левое внешнее соединение» между моей таблицей вопросов и ответов, но яхочу, чтобы это было сделано с помощью ORM Доктрины.Какие-либо предложения?Я довольно новичок в мире ORM.

1 Ответ

2 голосов
/ 11 марта 2012

Я сделал это! Вот как это сделать:

Я создал поле в своей сущности 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 и вуаля!

...