Doctrine2 GROUP BY на postgresql

У меня есть эти две модели:

\App\Models\Message
\App\Models\User

Сообщение также имеет среди прочего эти два атрибута:

 /**
* @ORM\ManyToOne(targetEntity="User", inversedBy="sentMessages")
* @ORM\JoinColumn(name="from_id", referencedColumnName="id", nullable=false)
* @var User
*/
protected $from;

/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="receivedMessages")
* @ORM\JoinColumn(name="to_id", referencedColumnName="id", nullable=false)
* @var User
*/
protected $to;

Теперь, чего я хотел достичь, это:

 /**
* @param User $user
* @return mixed|Message[]
*/
public function getUserConversations(User $user)
{
$qb = $this->em->createQueryBuilder();
$qb->select('m')
->from(Message::class, 'm')
->where('m.to = :user')
->orderBy('m.sent', 'DESC')
->groupBy('m.from')
->setParameter('user', $user);

return $qb->getQuery()->execute();
}

Другими словами, я хочу, чтобы все сообщения, где дано $user используется как получатель (где он m.to), и для каждого отправителя этих сообщений я хочу их только один раз, например, таблица:

id | from_id | to_id
1  | 1       | 2
2  | 5       | 9
3  | 1       | 5
4  | 1       | 9
5  | 5       | 1 <--
6  | 8       | 1 <--
7  | 8       | 1

за $user с идентификатором 1 я хочу получать только возвращенные сообщения с идентификаторами: 5 и 6.

Использование кода выше postgresql дает:

Возникла исключительная ситуация при выполнении команды SELECT … GROUP BY m0_.from_id ORDER BY m0_.sent_at DESC с параметрами [1]: SQLSTATE [42803]: Ошибка группировки: 7 ОШИБКА: в ГРУППЕ должен появиться столбец «m0_.text» Предложение BY или использоваться в агрегатной функции LINE 1: SELECT m0_.text AS text_0, m0_.sent_at AS sent_at_1, m0_.rea …

Поиск в Google показывает, что postgres не знает, какие строки 6 и 7 верны в случае их группировки (но MySQL делает это без проблем, как показано здесь: Query Builder и Group By на двух столбцах в Symfony2 / Doctrine генерируют дубликаты).

Я также знаю о Postgres DISTINCT ON поскольку он делает именно то, что я хочу, но для того, чтобы он заработал, требуется NativeQuery, что мне не очень нравится.

  1. Есть ли хорошее решение для этого только с одним QueryBuilder без использования внутренних селекторов?
  2. Есть ли решение для этого случая через перевернутый столбец \App\Models\User$receivedMessages?
  3. Любые другие идеи приветствуются

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]