postgresql上的Doctrine2 GROUP BY

时间:2016-09-21 14:58:22

标签: php postgresql doctrine-orm doctrine-orm-postgres

我有这两个模型:

\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,这是我不太喜欢的。

  1. 有没有一个很好的解决方案,只有一个QueryBuilder而不使用内部选择?
  2. 通过\App\Models\User - $receivedMessages的反向列,是否有针对此案例的解决方案?
  3. 欢迎任何其他想法

0 个答案:

没有答案