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。我需要选择用户
数据,并且仅选择他们最近评论的文本
(如果存在)。我真的在努力拼凑如何做到这一点。到目前为止,我的想法是:
- 查询应该是
用户ID上带有leftJoin()
表的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”标记。谢谢您是否已检查是否可以对其应用集合筛选?对我来说似乎是个好办法。