Php Symfony原则Querybuilder-仅选择一对多关系中有序联接的第一行

Php Symfony原则Querybuilder-仅选择一对多关系中有序联接的第一行,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,假设我有一对多关系中的实体User和Comment。假设在模型中正确设置了关系,并在用户模型上调用注释。假设Comment有一个字段text,它是在注释中写入的文本 每个注释属于一个用户,但每个用户可以有任意数量的注释(包括完全没有注释) 我用的是ORM2.7。我需要选择用户数据,并且仅选择他们最近评论的文本(如果存在)。我真的在努力拼凑如何做到这一点。到目前为止,我的想法是: 查询应该是leftJoin()用户ID上带有Comment表的User。我想我需要leftJoin,因为这样仍然会选

假设我有一对多关系中的实体
User
Comment
。假设在模型中正确设置了关系,并在
用户
模型上调用
注释
。假设
Comment
有一个字段
text
,它是在注释中写入的文本

每个
注释
属于一个
用户
,但每个
用户
可以有任意数量的注释(包括完全没有注释)

我用的是ORM2.7。我需要选择
用户
数据,并且仅选择他们最近评论的
文本
(如果存在)。我真的在努力拼凑如何做到这一点。到目前为止,我的想法是:

  • 查询应该是
    leftJoin()
    用户ID上带有
    Comment
    表的
    User
    。我想我需要
    leftJoin
    ,因为这样仍然会选择没有任何注释的用户
  • 注释部分需要是一个嵌套查询,对具有该用户id的注释执行类似于“按id排序描述限制1”的操作,以便只选择最近的一个
  • 我不认为我可以使用
    groupBy()
    ,因为我需要选择最新评论的
    文本
    ,但我可能可以通过这里获得
    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();
我觉得嵌套查询必须是这样的:

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

这是一个虚构的例子;在实际应用程序中,优化是一个问题,因此我希望尽量减少执行的嵌套查询的数量。似乎有一个很好的原始SQL方法,但我对如何将其转换为查询生成器语法感到困惑。任何帮助都将不胜感激。

您的前两个项目说明您了解SQL。“对如何将其转换为查询生成器语法感到困惑”表示该框架是个障碍;我将从我的问题中删除“mysql”标记。谢谢您是否已检查是否可以对其应用集合筛选?对我来说似乎是个好办法。