Heim >PHP-Framework >Laravel >Bitte nicht sortieren, wenn Sie die chunkById-Methode verwenden!
Die folgende Tutorial-Kolumne von Laravel führt Sie bitte nicht ein, wenn Sie die chunkById-Methode verwenden! , ich hoffe, es wird Freunden in Not helfen!
Bitte sortieren Sie nicht, wenn Sie die Methode chunkById verwenden Die Datenmenge muss stapelweise verarbeitet werden. Es ist unrealistisch, sie alle auf einmal herauszunehmen und dann auszuführen. Glücklicherweise stellt uns Laravel die Methode chunkById zur Verfügung, mit der wir sie bequem verarbeiten können. Der Pseudocode lautet wie folgt:
Student::query() ->where('is_delete', false) ->orderBy('id', 'DESC') ->chunkById(200, function($students) { // 在这里进行逻辑处理 });Auf den ersten Blick gibt es kein Problem, aber wenn Sie den Code tatsächlich ausführen, werden Sie feststellen, dass chunkById nur zum ersten Mal ausgeführt wird und nach dem zweiten Mal aus irgendeinem Grund nicht mehr ausgeführt wird Zeit.
Finden Sie den Grund
Der chunkById-Code im Laravel-Quellcode lautet wie folgtpublic 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; }Es scheint kein Problem zu geben, da die while-Schleife anhand von $countResults == $count beurteilt wird, dann werfen wir diese beiden Variablen ab und wir werden feststellen, dass diese beiden beim ersten Mal konsistent sind und das Programm beim zweiten Mal aufgrund inkonsistenter Daten stoppt. Im obigen Code wird $count durch $results = $clone->forPageAfterId($count, $lastId, $column)->get(); erhalten.
Weiter zur Anzeige der forPageAfterId-Methode
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); }We Sie können sehen, dass die hier zurückgegebenen Ergebnisse nach orderBy in aufsteigender Reihenfolge angeordnet sind, während unser ursprünglicher Code in absteigender Reihenfolge angeordnet ist, was zu einer inkonsistenten Zählung führt und dazu führt, dass chunkById die Ausführung beendet.
Lösung
Entfernen Sie einfach die vorherige orderBy('id', 'desc').Student::query() ->where('is_delete', false) ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
Zusammenfassung
Fügen Sie in Zukunft keine benutzerdefinierte Sortierung hinzu, wenn Sie chunkById oder die Chunk-Methode verwenden.
Sie werden lernen, während Sie lernen. . .
Das obige ist der detaillierte Inhalt vonBitte nicht sortieren, wenn Sie die chunkById-Methode verwenden!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!