1

对于实体“消息”,我需要按用户字段获取接收者最后的消息组。

这是实体及其关系:

/**
 * @ORM\Entity(repositoryClass="App\Repository\MessageRepository")
 */
class Message
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="messages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $User;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="receivedmessages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $receiver;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $text;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $creationdate;

到目前为止,这是我在消息存储库中的查询构建器,用于获取用户接收者的最后一条消息:

public function getConversations($dest)
{
  $qb = $this
    ->createQueryBuilder('c')
    ->Where('c.receiver = :dest')
    ->setParameter('dest', $dest)
    ->orderBy('c.creationdate', 'DESC')
    ->groupBy('c.User')
  ;

  return $qb
    ->getQuery()
    ->getResult()
  ;
}

当我运行此查询时,我收到错误消息:

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #1 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“spro.m0_.id”;这与 sql_mode=only_full_group_by 不兼容

在其他方面,有人说我们需要从 mysql 控制台中删除 ONLY_FULL_GROUP_BY 以避免此错误,也有人说不推荐这样做。

是否有另一种方法可以在不更改数据库设置的情况下进行查询?

编辑:我也尝试从存储库用户获取消息,而不是从消息存储库中获取消息,如下所示:

public function getConversations($id)
{
  $qb = $this
    ->createQueryBuilder('u')
    ->andWhere('u.id = :val')
    ->setParameter('val', $id)
    ->Join('u.receivedmessages', 'd')
    ->groupBy('d.User')
    ->Select('d')
  ;

  return $qb
    ->getQuery()
    ->getResult()
  ;
}

在这种情况下,我收到错误消息:

[Semantical Error] line 0, col -1 near 'SELECT d FROM':错误:如果不选择至少一个根实体别名,则无法通过标识变量选择实体。

4

0 回答 0