Symfony разговоров QueryBuilder - PullRequest
       90

Symfony разговоров QueryBuilder

0 голосов
/ 22 апреля 2020

Я пытаюсь создать систему сообщений на моем Symfony 4.4 веб-сайте, я создал сущность Сообщение со следующими полями:

  • sentFrom (Entity User)
  • sentTo (Entity User)
  • содержание (текст)
  • просмотрено (bool)
  • ОпубликованоAt (дата / время)

Моя страница с одним разговором готова :

->select('m')
->where('m.sentTo = :sender AND m.sentFrom = :receiver')
->orWhere('m.sentTo = :receiver AND m.sentFrom = :sender')
->setParameter('sender', $sender)
->setParameter('receiver', $receiver)
->orderBy('m.publishedAt', 'ASC')

Теперь я пытаюсь создать индексную страницу разговоров со списком разговоров, упорядоченных по дате публикации. Я могу выбрать всех текущих отправленных или полученных сообщений пользователя, выполнив следующие действия:

->select('m')
->join('m.sentFrom', 'f')
->join('m.sentTo', 't')
->where('f = :user OR t = :user')
->setParameter('user', $user)
->orderBy('m.publishedAt', 'DESC')

Но я хочу сгруппировать все сообщения пользователей, с которыми он болтает, и упорядочить по DES C по последнему опубликованному сообщению. пользователь. Или, может быть, я должен создать систему сообщений по-другому? Заранее спасибо.

1 Ответ

0 голосов
/ 22 апреля 2020

Ваша модель достаточно проста для разговора 1: 1.

Но сделать то, что вы хотите, только с одним запросом немного сложно.

Получить последние сообщения

->select('m')
->join('m.sentFrom', 'f')
->join('m.sentTo', 't')
->where('f = :user OR t = :user')
->setParameter('user', $user)
->orderBy('m.publishedAt', 'DESC')

Перебрать результаты

Чем создать массив с ключом "sentFrom-sendTo"

Для каждого ключа этого массива используйте свой первый запрос для извлечения диалога.

Это немного глупо, но я не нашел способа сделать это только одним запросом

Способ упрощения:)

Но если вы хотите в будущем при групповых беседах вам нужно будет добавить другую модель (почему бы не беседа ?), которая может иметь свойство lastPublishedMessage, которое обновляется при каждой отправке сообщения в беседе. Это сделает ваш заказ прецедентом очень простым для достижения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...