对于实体“消息”,我需要按用户字段获取接收者最后的消息组。
这是实体及其关系:
/**
* @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':错误:如果不选择至少一个根实体别名,则无法通过标识变量选择实体。