1

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

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

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

有谁知道/如果我可以从findBy()函数中获取这些信息?

4

2 回答 2

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 );

但是这方面的性能不会那么好,因为您实际上是在获取所有对象。

于 2012-10-18T00:26:09.003 回答
-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);
于 2013-01-31T06:06:40.130 回答