使用这样的查询获得正确的结果是有问题的。 Doctrine 网站上有一个教程解释了这个问题。
分页 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/pagination.html
本教程更多的是关于分页而不是获取前 5 个结果,但总体思路是您需要执行“SELECT DISTINCT a.id FROMarticles a ... LIMIT 5”而不是普通的 SELECT。它比这更复杂一些,但是该教程中的最后两点应该会让您走上正轨。
Update:
这里的问题不是 Doctrine 或任何其他 ORM。问题完全在于数据库是否能够返回您所要求的结果。这就是连接的工作原理。
如果您对查询进行 EXPLAIN,它将为您提供有关正在发生的情况的更深入的答案。将其结果添加到您最初的问题中是个好主意。
根据分页文章中讨论的内容,您似乎需要至少 2 个查询才能获得所需的结果。在查询中添加 DISTINCT 可能会显着减慢查询速度,但只有在其中包含联接时才真正需要它。您可以编写另一个查询,仅检索按创建日期排序的前 10 个帖子,而不使用联接。一旦您获得了这 10 个帖子的 ID,请使用您的联接执行另一个查询,然后WHERE blogpost.id IN (...) ORDER BY blogpost.created
。这种方法应该更有效。
SELECT
bp
FROM
Blogpost bp
ORDER BY
bp.created DESC
LIMIT 10
由于您在第一个查询中关心的只是 ID,因此您可以将 Doctrine 设置为使用标量水合。
SELECT
bg
FROM
Blogpost bp
LEFT JOIN
bp.comments c
LEFT JOIN
bp.tags t
WHERE
bp.id IN (...)
ORDER BY
bp.created DESC
您也可以使用相关子查询在一个查询中完成此操作。子查询总是不好的神话是不正确的。有时它们比连接更快。您需要进行试验才能找出最适合您的解决方案。