1

我有这两个模型:

\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

对于$userID 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,我不太喜欢。

  1. 有没有什么好的解决方案,只有一个 QueryBuilder 而不使用内部选择?
  2. \App\Models\User通过-的反列是否有解决这种情况的方法$receivedMessages
  3. 欢迎任何其他想法
4

0 回答 0