chunkById メソッドを使用する場合はソートしないでください。

藏色散人
リリース: 2020-11-04 14:25:40
転載
3825 人が閲覧しました

次のチュートリアル コラムでは、Laravel について紹介します。chunkById メソッドを使用する場合はソートしないでください。 , 困っている友達のお役に立てれば幸いです!

chunkById メソッドを使用する場合はソートしないでください。

chunkById メソッドを使用する場合はソートしないでください

最近、開発タスクを実行しているときに奇妙な問題に遭遇したので共有します。

#問題の説明

データはバッチで処理する必要があり、このデータの量は非常に大きいため、すべてを取得するのは非現実的です幸いなことに、便利に処理できる chunkById メソッドを提供してくれるのは Laravel です。疑似コードは以下のとおりです

Student::query()
    ->where('is_delete', false)
    ->orderBy('id', 'DESC')
    ->chunkById(200, function($students) {
            // 在这里进行逻辑处理
    });
ログイン後にコピー

一見問題ありませんが、実際にコードを実行してみると、chunkByIdは初回のみ実行され、しばらく実行されなくなることがわかります。 2回目以降の理由。

理由を見つけてください

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;
    }
ログイン後にコピー

while ループがあるので問題ないようです$countResults == $count に基づいて判断するために、これら 2 つの変数をダンプすると、1 回目はそれらが一貫しており、2 回目はデータの不整合によりプログラムが停止することがわかります。

上記のコードでは、$count は $results = $clone->forPageAfterId($count, $lastId, $column)->get();,

Continue によって取得されます。 forPageAfterId メソッドを表示するには

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 の昇順に並べられているのに対し、元のコードは降順に並べられていることがわかります。これによりカウントが不一致になり、chunkById が終了します。埋め込む。

解決策

前の orderBy('id', 'desc') を削除するだけです。

Student::query()
    ->where('is_delete', false)
    ->chunkById(200, function($students) {
            // 在这里进行逻辑处理
    });
ログイン後にコピー

概要

  • 今後 chunkById またはチャンク メソッドを使用する場合はカスタム並べ替えを追加しないでください

  • クールであることで年を重ね、学ぶことで学ぶことができます。 。 。

以上がchunkById メソッドを使用する場合はソートしないでください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート