Heim > PHP-Framework > Laravel > Bitte nicht sortieren, wenn Sie die chunkById-Methode verwenden!

Bitte nicht sortieren, wenn Sie die chunkById-Methode verwenden!

藏色散人
Freigeben: 2020-11-04 14:25:40
nach vorne
3831 Leute haben es durchsucht

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 nicht sortieren, wenn Sie die chunkById-Methode verwenden!

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) {
            // 在这里进行逻辑处理
    });
Nach dem Login kopieren

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 folgt

  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;
    }
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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) {
            // 在这里进行逻辑处理
    });
Nach dem Login kopieren

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!

    Verwandte Etiketten:
    Quelle:learnku.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage