Транспонировать необработанный SQL запрос с doctrine - PullRequest
0 голосов
/ 19 марта 2020

Я довольно новичок в Doctrine ORM и пытаюсь преобразовать необработанный запрос SQL с помощью doctrine, чтобы получить массив сущностей.

По сути, я хочу получить один из подробнее course объекты, в которых пользователь зарегистрирован косвенно. Идентификатор course находится в таблице traineeship. Идентификатор traineeship и идентификатор user находятся в таблице registration.

Вот мой SQL запрос:

SELECT * FROM course c
LEFT JOIN traineeship t
ON c.id = t.courseId
LEFT JOIN registration r
ON t.id = r.traineeshipId
WHERE r.userId = 2681;

Вот что я пытаюсь сделать с doctrine:

    return $this->createQueryBuilder('c')
    ->andWhere('t.course = c')
    ->leftJoin('c.traineeships', 't')
    ->andWhere('r.traineeship = t')
    ->leftJoin('t.registrations', 'r')
    ->andWhere('r.id = :user')
    ->setParameter('user', $user)
    ->getQuery()
    ->execute();

С моим необработанным SQL запросом, Я получаю два ожидаемых результата с заданным идентификатором. Сгенерированный запрос по doctrine, я получаю только один результат. Поэтому я предполагаю, что мое doctrine использование плохо.

(Doctrine отношения:

Курс OneToMany Стажировка

Стажировка OneToMany Регистрация

Регистрация ManyToOne Пользователь)

1 Ответ

0 голосов
/ 22 марта 2020

Из необработанного SQL Я ожидал бы следующий запрос:

return $this->createQueryBuilder('c')
    ->leftJoin('c.traineeships', 't')
    ->leftJoin('t.registrations', 'r')
    ->andWhere('r.user = :user')
    ->setParameter('user', $user)
    ->getQuery()
    ->getResult();

Обратите внимание, что я использую ->andWhere('r.user = :user') вместо ->andWhere('r.id = :user'), поскольку я предполагаю, что registration.id содержит идентификатор регистрации, но не идентификатор пользователя. В моем запросе я также предполагаю, что registration имеет атрибут user, который содержит ссылку на пользователя.

Запрос должен возвращать массив сущностей курса.

...