如何在 Laravel 控制台命令中循环遍历光标分页的所有页面?
$paginator = User::query()->orderBy('id')->cursorPaginate(2);
while ($paginator->hasPages()) {
foreach ($paginator->items() as $item) {
$this->info($item->id);
}
$paginator = $paginator->nextCursor();
}
我陷入循环,请帮忙。
我不确定这是否是最好的方法,但你可以这样做:
$query = User::query()->orderBy('id');
$paginator = $query->cursorPaginate(20, ['*'], 'myCursorId');
while ($paginator->hasPages()) {
foreach ($paginator->items() as $item) {
$this->info($item->id);
}
$next = $paginator->nextCursor();
$paginator = $query->cursorPaginate(20, ['*'], 'myCursorId', $next);
}
nextCursor()
函数返回新查询的请求点。
您也可以使用 chunk
但可能会比光标方法消耗更多内存。
将此函数宏添加到 ServiceProvider 中的 Laravel 查询生成器中,然后就可以循环任何模型了:
Builder::macro('cursorPaginateItemsGenerator',
/**
* @param int $perPage
* @param array $columns
* @param string $cursorName
* @param callable|null $callback
* @return \Generator
*/
function (int $perPage = 100, array $columns = ['*'], string $cursorName = 'cursor', ?callable $callback = null) {
$cursorPaginator = $this->cursorPaginate($perPage, $columns, $cursorName);
do {
yield is_callable($callback) ? array_map($callback, $cursorPaginator->items()) : $cursorPaginator->items();
} while ($cursorPaginator->hasMorePages() && $cursorPaginator = $this->cursorPaginate($perPage, $columns, 'cursor', $cursorPaginator->nextCursor()));
});
像这样使用:
foreach(User::query()->orderBy('id')->cursorPaginateItemsGenerator(20,['*'],'cursorId') as $users){
dd($users);
}
$users 每个 foreach 循环最多包含 20 个项目