Symfony Doctrine Querybuilder - 仅选择一对多关系中有序连接的第一行

问题描述 投票:0回答:1

假设我有一对多关系中的实体

User
Comment
。假设该关系在模型中正确设置,并且在
comments
模型上称为
User
。假设
Comment
有一个字段
text
,即评论中写入的文本。

每个

Comment
都属于一个
User
,但每个
User
可以有任意数量的评论(包括根本没有评论。)

我正在使用 Doctrine-ORM 2.7。我需要选择

User
数据,并且仅选择他们最近评论的
text
(如果存在)。我真的很难拼凑出如何做到这一点。到目前为止我的想法:

  • 查询应在
    leftJoin()
    User
    表上对用户 ID 进行查询。我想我想要一个
    Comment
    ,因为这样没有任何评论的用户仍然会被选中。
    评论部分需要是一个嵌套查询,对具有该用户 ID 的评论执行类似 
  • LEFT JOIN
  • 的操作,以便仅选择最新的评论。
    我认为我不能使用
  • ORDER BY id DESC LIMIT 1
  • ,因为我需要选择最近评论的
    groupBy()
    ,但我可能可以通过这里获得
    text
    ,这可能会派上用场?
    
    
  • 到目前为止我的尝试进展:

MAX(comment.id)

我觉得嵌套查询必须是这样的:

$qb = $em->getRepository(User::class) ->createQueryBuilder('u') ->select('u.id, u.username') // ...etc. user data ->addSelect('c.text') // comment text ->leftJoin('u.comments', 'c', 'WITH', ....) // Place nested subquery here somehow? ->getQuery() ->getArrayResult();

这是一个虚构的例子;在实际应用程序中,
优化是一个问题

,所以我想最大限度地减少执行的嵌套查询的数量。 这个答案似乎有一个很好的原始 SQL 方法,但我对如何将其转换为查询生成器语法感到困惑。任何帮助将不胜感激。

php symfony doctrine-orm doctrine
1个回答
0
投票

这是我提出的查询:

$qb = $em->getRepository(Comment::class) ->createQueryBuilder('c') ->select('c.id') ->where('c.user', ':user') ->orderBy('id', 'desc') ->getQuery() ->getScalarResult();

您仍然需要过滤最新评论。

它符合我的目的,虽然它给出了一个响应,看起来像这样:

$users = $this->getEntityManager() ->getRepository(User::class) ->createQueryBuilder('u') ->select('u.id') ->addSelect('c.id AS c_id', 'c.text') ->join('u.pub', 'c') ->getQuery() ->getResult();

而不是这个:

"id": 1, "c_id": 1, "text": "...",

但这并不是真正的问题。

© www.soinside.com 2019 - 2024. All rights reserved.