我有这两个模型:
\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
ID 1,我只想获取 ID 为 5 和 6 的返回消息。
使用 postgresql 上面的代码产生:
使用参数 [1] 执行“SELECT ... GROUP BY m0_.from_id ORDER BY m0_.sent_at DESC”时发生异常:SQLSTATE [42803]:分组错误:7 错误:列“m0_.text”必须出现在 GROUP BY 子句或用于聚合函数 LINE 1: SELECT m0_.text AS text_0, m0_.sent_at AS sent_at_1, m0_.rea...
谷歌搜索显示 postgres 不知道第 6 行和第 7 行中的哪一个是正确的,以防他将它们分组(但 MySQL 这样做没有任何问题,如下所示:Query Builder and Group By on two columns in Symfony2 / Doctrine generate重复)。
我也知道 postgres DISTINCT ON
,因为它完全符合我的要求,但为了让它工作,它需要 NativeQuery,我不太喜欢。
- 有没有什么好的解决方案,只有一个 QueryBuilder 而不使用内部选择?
\App\Models\User
通过-的反列是否有解决这种情况的方法$receivedMessages
?- 欢迎任何其他想法