Symfony Doctrine Querybuilder — выберите только первую строку упорядоченного соединения в отношениях «один ко многим» ⇐ Php
Symfony Doctrine Querybuilder — выберите только первую строку упорядоченного соединения в отношениях «один ко многим»
Предположим, у меня есть сущности Пользователь и Комментарий в отношении один-ко-многим. Предположим, что связь в моделях настроена правильно и называется comments в модели User. Допустим, Comment имеет поле text, содержащее текст, записанный в комментарии.
Каждый Комментарий принадлежит одному Пользователю, но каждый Пользователь может иметь любое количество комментариев (в том числе отсутствие комментариев вообще).
р>
Я использую Doctrine-ORM 2.7. Мне нужно выбрать данные Пользователя и только текст его самого последнего комментария, если он существует. Я действительно изо всех сил пытаюсь понять, как это сделать. Мои мысли на данный момент:
[*]Запрос должен leftJoin() User с таблицей Comment для идентификатора пользователя. Я думаю, мне нужно LEFT JOIN, поскольку в этом случае пользователи без комментариев все равно будут выбраны. [*]Часть комментариев должна представлять собой вложенный запрос, который выполняет что-то вроде ORDER BY id DESC LIMIT 1 для комментариев с этим идентификатором пользователя, чтобы выбирался только самый последний из них. Я не думаю, что смогу использовать groupBy(), поскольку мне нужно выбрать текст самого последнего комментария, но я, вероятно, мог бы получить MAX(comment.id) здесь, и это может пригодиться?
Мой прогресс в попытке:
$qb = $em->getRepository(User::class) ->createQueryBuilder('u') ->select('u.id, u.username') // ...и т.д. данные пользователя ->addSelect('c.text') // текст комментария ->leftJoin('u.comments', 'c', 'WITH', ....) // Как-нибудь разместить здесь вложенный подзапрос? ->getQuery() ->getArrayResult(); Мне кажется, что вложенный запрос должен быть примерно таким:
$qb = $em->getRepository(Comment::class) ->createQueryBuilder('c') ->select('c.id') ->where('c.user', ':user') ->orderBy('id', 'дескриптор') ->getQuery() ->getScalarResult(); Это вымышленный пример; в реальном приложении оптимизация вызывает беспокойство, поэтому я хотел бы свести к минимуму количество выполняемых вложенных запросов. Кажется, что этот ответ имеет хороший подход к необработанному SQL, но я не понимаю, как перевести его в синтаксис построителя запросов. Любая помощь будет оценена по достоинству.
Предположим, у меня есть сущности Пользователь и Комментарий в отношении один-ко-многим. Предположим, что связь в моделях настроена правильно и называется comments в модели User. Допустим, Comment имеет поле text, содержащее текст, записанный в комментарии.
Каждый Комментарий принадлежит одному Пользователю, но каждый Пользователь может иметь любое количество комментариев (в том числе отсутствие комментариев вообще).
р>
Я использую Doctrine-ORM 2.7. Мне нужно выбрать данные Пользователя и только текст его самого последнего комментария, если он существует. Я действительно изо всех сил пытаюсь понять, как это сделать. Мои мысли на данный момент:
[*]Запрос должен leftJoin() User с таблицей Comment для идентификатора пользователя. Я думаю, мне нужно LEFT JOIN, поскольку в этом случае пользователи без комментариев все равно будут выбраны. [*]Часть комментариев должна представлять собой вложенный запрос, который выполняет что-то вроде ORDER BY id DESC LIMIT 1 для комментариев с этим идентификатором пользователя, чтобы выбирался только самый последний из них. Я не думаю, что смогу использовать groupBy(), поскольку мне нужно выбрать текст самого последнего комментария, но я, вероятно, мог бы получить MAX(comment.id) здесь, и это может пригодиться?
Мой прогресс в попытке:
$qb = $em->getRepository(User::class) ->createQueryBuilder('u') ->select('u.id, u.username') // ...и т.д. данные пользователя ->addSelect('c.text') // текст комментария ->leftJoin('u.comments', 'c', 'WITH', ....) // Как-нибудь разместить здесь вложенный подзапрос? ->getQuery() ->getArrayResult(); Мне кажется, что вложенный запрос должен быть примерно таким:
$qb = $em->getRepository(Comment::class) ->createQueryBuilder('c') ->select('c.id') ->where('c.user', ':user') ->orderBy('id', 'дескриптор') ->getQuery() ->getScalarResult(); Это вымышленный пример; в реальном приложении оптимизация вызывает беспокойство, поэтому я хотел бы свести к минимуму количество выполняемых вложенных запросов. Кажется, что этот ответ имеет хороший подход к необработанному SQL, но я не понимаю, как перевести его в синтаксис построителя запросов. Любая помощь будет оценена по достоинству.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Внешние ключи/столбцы соединения и таблицы соединения не создаются Doctrine в Symfony 5+
Anonymous » » в форуме Php - 0 Ответы
- 39 Просмотры
-
Последнее сообщение Anonymous
-