如何从Doctrine2中的分页“ Findby”获得 *总数 *的结果数



我正在尝试查看是否有一种在不编写自定义DQL的情况下使用Doctrine2进行分页的方法。我发现findBy()函数返回了我想要的结果集,但是我缺少一条信息来正确地在UI上,即 total total 记录数量>可以返回。

我真的希望这是可能的,因为它是一个"简单"的一线。

    $transactions = IcarusEntityServicePlanTransaction::getRepository()->findBy(array('user' => $userId, 'device' => $device), null, $transactionsPerPage, $currentPage);

有人知道/如果我可以从findBy()函数获取此信息?

简短的anwser,否。您本质上正在运行此查询:

SELECT * FROM transaction WHERE user = $userId AND device = "$device" LIMIT $currentPage, $transactionPerPage;

通过指定限制,查询只会从该限制内部的偏移量返回行数。因此,如果$transactionPerPage = 10,该查询返回的总行将为10

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

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

if ( !isset( $_SESSION['transactionCount'] ) ) 
{
    $transactionCount = $em->createQuery('SELECT COUNT(*) FROM IcarusEntityServicePlanTransaction WHERE user = ?1 AND device = ?2')
        ->setParameters( array( 1 => $userId, 2 => $device ) )
        ->getSingleScalarResult();
    $_SESSION['transactionCount'] = $transactionCount;
}

edit2:如果您真的不想使用DQL,则可以在偏移量和限制的情况下运行.findBy(),并在结果上执行大小:

$transactions = IcarusEntityServicePlanTransaction::getRepository()->findBy(array('user' => $userId, 'device' => $device) );
$totalTransactions = sizeof( $transactions );

但是,这种性能不会像您实际获取所有对象一样好。

您是否尝试过?

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

相关内容

  • 没有找到相关文章

最新更新