次のチュートリアル コラムでは、Laravel について紹介します。chunkById メソッドを使用する場合はソートしないでください。 , 困っている友達のお役に立てれば幸いです!
chunkById メソッドを使用する場合はソートしないでください
最近、開発タスクを実行しているときに奇妙な問題に遭遇したので共有します。
#問題の説明
データはバッチで処理する必要があり、このデータの量は非常に大きいため、すべてを取得するのは非現実的です幸いなことに、便利に処理できる chunkById メソッドを提供してくれるのは Laravel です。疑似コードは以下のとおりですStudent::query() ->where('is_delete', false) ->orderBy('id', 'DESC') ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
理由を見つけてください
Laravel のソースコードの chunkById コードは次のとおりですpublic function chunkById($count, callable $callback, $column = null, $alias = null) { $column = is_null($column) ? $this->getModel()->getKeyName() : $column; $alias = is_null($alias) ? $column : $alias; $lastId = null; do { $clone = clone $this; $results = $clone->forPageAfterId($count, $lastId, $column)->get(); $countResults = $results->count(); if ($countResults == 0) { break; } if ($callback($results) === false) { return false; } $lastId = $results->last()->{$alias}; unset($results); } while ($countResults == $count); return true; }
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') ->take($perPage); }
解決策
前の orderBy('id', 'desc') を削除するだけです。Student::query() ->where('is_delete', false) ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
概要
以上がchunkById メソッドを使用する場合はソートしないでください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。