何千もの Eloquent の結果を処理する必要がある場合は、chunk
コマンドを使用できます。 chunk
メソッドは、Eloquent モデルの「チャンク」を取得し、それを指定されたクロージャに移入して処理します。 chunk
メソッドを使用すると、大規模なデータ セットを処理する際のメモリ消費を効果的に削減できます。 chunk
命令。chunk
方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理。使用 chunk
方法能够在处理大量数据集合时能够有效减少内存消耗:
Flight::chunk(200, function ($flights) { foreach ($flights as $flight) { // } });
$all_ark=Arkvolume::chunk(50000, function ($flights) { foreach ($flights as $flight) { $GLOBALS['something'][] = $flight['id']; } }); var_dump($GLOBALS['something'] );exit;
这段代码是执行一个100条的数据进行更新,当执行完成后继续后面的另一百条数据……
也就是说他每次操作的是一个数据块而不是整个数据库。
需要注意的是:当使用带筛选的条件的chunk时,如果是自更新,那么你会漏掉一些数据,接着看代码:
User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); } });
如果要运行上面的代码,并不会有报错,但是where
条件是筛选approved
为0
的user
然后将approved
的值跟新为1
。
在这个过程中,档第一数据库的数据被修改后,下一个数据块的数据将是在被修改后的数据中选出来的,这个时候数据变了,而page也加了1。所以执行结束后,只对数据中一半的数据进行了更新操作。
如果没有明白的话,我们来看一下chunk的底层实现。还以上面的代码为例,假如一共有400条数据,数据被按照100条进行分块处理。
page = 1: 最开始的时候page为1,选取1-100条数据进行处理;
page = 2: 这时候前一百数据的approved
public function chunk($count, callable $callback) { $results = $this->forPage($page = 1, $count)->get(); while (count($results) > 0) { // 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 (call_user_func($callback, $results) === false) { return false; } $page++; $results = $this->forPage($page, $count)->get(); } return true; }
where
条件は、approved
が 0
である user
をフィルタリングすることです。 set approved
の値は 1
に更新されます。 🎜この処理では、最初のデータベースのデータが変更された後、変更されたデータの中から次のデータブロックのデータが選択されます。この時点でデータは変更されており、ページも1つ増加しています。したがって、実行後はデータ内の半分のデータしか更新されていません。 🎜🎜理解できない場合は、チャンクの基礎となる実装を見てみましょう。上記のコードを例にすると、データが合計400個ある場合、データは100個ごとにブロックに分割されます。 🎜page = 1: 最初はページが 1 で、1 ~ 100 個のデータが処理のために選択されます。 🎜page = 2: この時点で、最初のページの 承認
値が選択されます。 100個のデータは全て1なので、次のフィルタリングでは101番目からデータが開始され、この時page=2であれば処理されるデータは200~300番目までのデータとなります。 。 🎜🎜🎜🎜りー以上がLaravelでのチャンクセット処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。