假设我有一对多关系中的实体
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 方法,但我对如何将其转换为查询生成器语法感到困惑。任何帮助将不胜感激。
这是我提出的查询:
$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": "...",
但这并不是真正的问题。