У меня есть эти две модели:
\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, что мне не очень нравится.
\App\Models\User
— $receivedMessages
?Задача ещё не решена.
Других решений пока нет …