Laravel 光标分页循环在控制台命令中

问题描述 投票:0回答:2

如何在 Laravel 控制台命令中循环遍历光标分页的所有页面?

$paginator = User::query()->orderBy('id')->cursorPaginate(2);
    
while ($paginator->hasPages()) {
    foreach ($paginator->items() as $item) {
        $this->info($item->id);
    }

    $paginator = $paginator->nextCursor();
}

我陷入循环,请帮忙。

php laravel pagination cursor
2个回答
1
投票

我不确定这是否是最好的方法,但你可以这样做:

$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
但可能会比光标方法消耗更多内存。


0
投票

将此函数宏添加到 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 个项目

© www.soinside.com 2019 - 2024. All rights reserved.