0

虽然我知道这是微不足道的,但我一直在尝试使用 DoctrineORMAdapter 实现 pagerfanta Paginator,但我想按 id 降序对所有实体进行分页,我想要的最终 SQL 是这样的:

SELECT id, name FROM User ORDER BY id DESC LIMIT 0, 5;

假设我有从 A 到 Z 的用户,并且我想将它们限制为每页 5 个,DoctrineORMAdapter 将用户 E 分页结果在第一页中列出的 A,而我真正期望的是看到用户 Z 到用户 V第一页,第二页中的 U 到 Q,依此类推。我传递给 DoctrineORMAdapter 的 DQL 如下:

SELECT u FROM My\FluffyBundle\Entity\User u ORDER BY u.id DESC

在执行时,这是第一页的最终 DQL:

SELECT DISTINCT id0 FROM (SELECT u0_.id AS id0, u0_.name AS name1 FROM User u0_ 
ORDER BY u0_.id DESC) dctrn_result LIMIT 5 OFFSET 0

请注意,当使用 ArrayAdapter 而不是 DoctrineORM 时,它可以按预期工作,但是当您有数千个复杂的 Doctrine 实体时,依赖 ArrayAdapter 并不是一个好主意,即使是额外的延迟加载:D。

这是唯一相关的代码:

$queryBuilder = $repo->createQueryBuilder('u')->orderBy('u.id', 'DESC');
$adapter = new DoctrineORMAdapter($queryBuilder);
$pager = new Pagerfanta($adapter);
$pager->setMaxPerPage(5);

谢谢。

4

1 回答 1

9

这将帮助您:

$adapter = new DoctrineORMAdapter($queryBuilder, false);

今天早上有同样的问题。默认情况下,Pagerfanta 将您的查询视为具有连接的查询。将第二个参数设置为 false 使其使用简单的查询处理。

在 Kunstmaan Bundle 的 AdminListConfiguration 类中,如果要对简单实体进行排序,则必须覆盖创建 Pagerfanta 的函数。

于 2015-12-15T17:59:52.780 回答