Doctrine orm 如何从Doctrine2中分页的“findBy”中获取*总数*的结果?

Doctrine orm 如何从Doctrine2中分页的“findBy”中获取*总数*的结果?,doctrine-orm,pagination,Doctrine Orm,Pagination,我想看看是否有一种方法可以在不编写自定义DQL的情况下使用Doctrine2进行分页。我发现该函数返回我想要的结果集,但是我缺少一条在UI上正确分页的信息,即结果可能返回的记录总数 我真的希望这是可能的,因为这是一个“简单”的一行 $transactions = \Icarus\Entity\ServicePlan\Transaction::getRepository()->findBy(array('user' => $userId, 'device' => $dev

我想看看是否有一种方法可以在不编写自定义DQL的情况下使用Doctrine2进行分页。我发现该函数返回我想要的结果集,但是我缺少一条在UI上正确分页的信息,即结果可能返回的记录总数

我真的希望这是可能的,因为这是一个“简单”的一行

    $transactions = \Icarus\Entity\ServicePlan\Transaction::getRepository()->findBy(array('user' => $userId, 'device' => $device), null, $transactionsPerPage, $currentPage);

有人知道我如何/是否可以从
findBy()
函数中获取此信息吗?

Short anwser,没有。您实际上是在运行此查询:

SELECT * FROM transaction WHERE user = $userId AND device = "$device" LIMIT $currentPage, $transactionPerPage;
通过指定限制,查询只返回该限制内偏移量的行数。因此,如果
$transactionPerPage=10
,则该查询返回的行总数将为
10

假设总计数多少是静态的,我建议首先在第一页请求中对匹配文档的总数进行计数,并缓存该结果(或存储在会话中),因此只需获取一次总计数

编辑:仅使用普通php会话的计数查询示例:

if ( !isset( $_SESSION['transactionCount'] ) ) 
{
    $transactionCount = $em->createQuery('SELECT COUNT(*) FROM \Icarus\Entity\ServicePlan\Transaction WHERE user = ?1 AND device = ?2')
        ->setParameters( array( 1 => $userId, 2 => $device ) )
        ->getSingleScalarResult();
    $_SESSION['transactionCount'] = $transactionCount;
}
edit2:如果您确实不想使用DQL,您可以运行
.findBy()
,不带偏移量和限制,并对结果进行大小调整:

$transactions = \Icarus\Entity\ServicePlan\Transaction::getRepository()->findBy(array('user' => $userId, 'device' => $device) );
$totalTransactions = sizeof( $transactions );
但是这方面的性能不会很好,因为您实际上正在获取所有对象。

您尝试过这个吗

$queryBuilder->select('p.id, p.name')
                 ->from('\Api\Project\Entity\Project', 'p')
                 ->where('p.status = :status')
                 ->setParameter('status', 1)
                 ->orderBy('p.createdDate', 'asc')
                 ->setFirstResult($page)
                 ->setMaxResults($limit);

你试过了吗?我已经看过了,但是它需要客户DQL,而且不是那么简洁。如果没有其他简单的方法来获取总行数,那么我可能最终会使用它。@meze我已经研究了Paginator的工作原理,为了不依赖数据库,它执行两个查询。我将试用Paginator,看看它的性能如何。谢谢谢谢,但如果可能的话,我希望远离DQL。答案通常不涉及问题。