2025年7月28日17:47:29
这几天在做数据导出优化,使用xlswriter作为导出组件,但是发现在 使用
$base->chunkById(2000, function ($list) use ($writer, $sheet1) {
发现导出的数据是乱的,偶尔有些重复,偶尔有些少了,很奇怪,把数据打印出来的时候,发现模型的主表的id是乱序的
查看了一下chunkById的代码
public function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id')
{
$this->orders = $this->removeExistingOrdersFor($column);
if (! is_null($lastId)) {
$this->where($column, '>', $lastId);
}
return $this->orderBy($column, 'asc')
->limit($perPage);
}
这里用的是id的 >
所以说,主表的id是 主键,但是返回的id是乱序,导出的数据就是乱的,
这里使用chunk方法是使用forpage
public function chunk($count, callable $callback)
{
$this->enforceOrderBy();
$page = 1;
do {
// We'll execute the query for the given page and get the results. If there are
// no results we can just break and return from here. When there are results
// we will call the callback with the current chunk of these results here.
$results = $this->forPage($page, $count)->get();
$countResults = $results->count();
if ($countResults == 0) {
break;
}
// On each chunk result set, we will pass them to the callback and then let the
// developer take care of everything within the callback, which allows us to
// keep the memory low for spinning through large result sets for working.
if ($callback($results, $page) === false) {
return false;
}
unset($results);
$page++;
} while ($countResults == $count);
return true;
}
所以可以避免导出数据混乱的问题,这里使用 chunkById
要注意主表的使用有序的主键