我相信此时您真正需要的唯一事情是计算从分页数据集(所有记录,而不仅仅是当前页面)的开头到当前页面上显示的第一条记录之前的所有事务的总和。
您可以通过查找整个数据集开始与当前页面事务之间发生的事务数量来获取此信息,并通过以下方式检索它们LIMIT
,并将它们相加。
您想要的第一件事是分页查询的确切约束。由于我们想要获取除当前页面之外的分页记录的另一个子集,因此您需要确保两个查询的结果具有相同的顺序。重用查询构建器对象会有所帮助(调整以匹配您的实际分页查询):
$baseQuery = DB::table('journal')
->join('transactions', 'transactions.journal_id', 'journal.id')
->where('date', '>', $fromDate)
->where('date', '<', $toDate)
->where('transactions.type', "=", 0)
->orderBy('date', 'asc');
// Note that we aren't fetching anything here yet.
然后,获取分页结果集。这将执行两个查询:一个查询记录总数,第二个查询特定页面的事务。
$paginatedTransactions = $baseQuery->paginate(100);
从这里,我们可以确定需要检索哪些记录的先前余额。返回的分页对象是一个实例LengthAwarePaginator
,它知道总共有多少条记录、页数、当前页数等。
使用这些信息,我们只需做一些数学计算即可获取我们需要的记录数量:
total records needed = (current page - 1) * records per page
假设用户在第 5 页,他们将看到 401 - 500 条记录,因此我们需要检索之前的 400 条记录。
// If we're on Page 1, or there are not enough records to
// paginate, we don't need to calculate anything.
if ($paginatedTransactions->onFirstPage() || ! $paginatedTransactions->hasPages()) {
// Don't need to calculate a previous balance. Exit early here!
}
// Use helper methods from the Paginator to calculate
// the number of previous transactions.
$limit = ($paginatedTransactions->currentPage() - 1) * $paginatedTransactions->perPage();
现在我们有了数据集中发生在当前页面之前的交易数量,我们可以再次利用基本查询来检索并计算总和:
$previousBalance = $baseQuery->limit($limit)->sum('amount');
在此处添加突出显示以解释使用您的数据库执行SUM
计算将带来很大的性能优势,而不是在 PHP 中循环进行。尽可能多地利用数据库!
将此余额添加到您的原始“昨天”余额中,您应该拥有分页交易的准确期初余额。
注意:理论上的所有伪编码可能都需要调整。如果有疑问或问题,很乐意修改。