我试图看看是否有办法在不编写自定义DQL的情况下对Doctrine2进行分页。我发现findBy()
函数返回了我想要的结果集,但是我缺少一条信息来在UI上正确分页,即总记录数量结果可以返回。
我真的希望这是可能的,因为它是一个“简单”的衬垫。
$transactions = \Icarus\Entity\ServicePlan\Transaction::getRepository()->findBy(array('user' => $userId, 'device' => $device), null, $transactionsPerPage, $currentPage);
有谁知道如何从findBy()
函数获取此信息?
答案 0 :(得分:1)
简短的回答,没有。您实际上是在运行此查询:
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()
,并对结果执行sizeof:
$transactions = \Icarus\Entity\ServicePlan\Transaction::getRepository()->findBy(array('user' => $userId, 'device' => $device) );
$totalTransactions = sizeof( $transactions );
但是在这方面的表现不会那么好,因为你实际上是在抓取所有物体。
答案 1 :(得分:-1)
你试过这个吗?
$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);