我有这两个模型:
\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
被用作接收者(他在哪里)并且对于这些消息的每个发送者我只想要它们一次,例如table:
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
对于ID为1的$user
,我只想获得带有ID的返回消息:5和6。
使用postgresql上面的代码产生:
执行&#39; SELECT ... GROUP BY m0_.from_id ORDER BY m0_.sent_at DESC&#39; with params [1]:SQLSTATE [42803]:分组错误:7 ERROR:column&#34; m0_.text&#34;必须出现在GROUP BY子句中或用于聚合函数LINE 1:SELECT m0_.text AS text_0,m0_.sent_at AS sent_at_1,m0_.rea ...
谷歌搜索告诉我,postgres不知道返回哪一行是正确的,以防他将它们分组(但MySQL没有任何问题,如下所示:Query Builder and Group By on two columns in Symfony2 / Doctrine generate duplicates)。
我也知道postgres DISTINCT ON
,因为它完全符合我的要求,但为了让它工作,它需要NativeQuery,这是我不太喜欢的。
\App\Models\User
- $receivedMessages
的反向列,是否有针对此案例的解决方案?