chunk (指定された数);" です。このメソッドは各ユーザー データを更新してから、データのクエリ時に大量のデータが取得されないように、各ユーザーのデータを管理し、システムへの負荷を軽減します。"/> chunk (指定された数);" です。このメソッドは各ユーザー データを更新してから、データのクエリ時に大量のデータが取得されないように、各ユーザーのデータを管理し、システムへの負荷を軽減します。">

ホームページ  >  記事  >  PHPフレームワーク  >  Laravelのチャンクメソッドの使い方

Laravelのチャンクメソッドの使い方

WBOY
WBOYオリジナル
2022-06-06 15:12:555443ブラウズ

laravel では、chunk() メソッドを使用して、コレクションを指定されたサイズの複数の小さなコレクションに分割します。構文は "$specified collection->chunk(specified number);" です。このメソッドはそれぞれユーザーのデータは各ユーザーのデータを表示する前に更新されるため、データのクエリ時に大量のデータが取得されず、システムへの負荷が軽減されます。

Laravelのチャンクメソッドの使い方

#この記事の動作環境: Windows 10 システム、Laravel バージョン 6、Dell G3 コンピューター。

laravel の chunk メソッドを使用する方法

chunk()

chunk メソッドを使用して、コレクションを指定されたサイズの複数の小さなコレクションに分割します。コレクションをグリッドに表示するのに非常に便利です。

$prices = collect([18, 23, 65, 36, 97, 43, 81]);
$prices = $prices->chunk(3);
$prices->toArray();

上記のコードはエフェクトを生成します。

[
    0 => [
        0 => 18,
        1 => 23,
        2 => 65
    ],
    1 => [
        3 => 36,
        4 => 97,
        5 => 43
    ],
    2 => [
        6 => 81
    ]
]

一般的な用途

そのような必要がある場合: データベース内のすべてのデータをクエリし、一連の更新を実行します

単純かつ粗雑ですメソッド クエリされたすべてのデータは foreach を使用して操作され、データベースに保存されます。

$users = User::all();
foreach ($users as $user) {
  $some_value = ($user->some_field > 0) ? 1 : 0;
  $user->update(['some_other_field' => $some_value]);
}

データが非常に大きい場合、システムのメモリが不足する可能性があり、この方法は明らかに不格好です。

Laravel は、この問題に対する簡単な解決策を提供します

Laravel のチャンク メソッドは、コレクションを指定されたサイズの複数の小さなコレクションに分割できます

User::chunk(100, function ($users) {
  foreach ($users as $user) {
    $some_value = ($user->some_field > 0) ? 1 : 0;
    $user->update(['some_other_field' => $some_value]);
  }
});

上記のコードを実行する原理 はい:

チャンクを実行すると、このチャンクは 100 個のユーザー データを検出し、各ユーザー データを更新します。

次に、100 個のユーザー データを確認し、更新操作を実行します。

これは、データをクエリするときにデータベースから大量のデータを取得するのではなく、テーブル全体をクエリする代わりに、毎回 100 個のデータをクエリすることを意味します。

これにより、システムへの負担が軽減されます。

2. 注意すべき点

この記事の焦点は次のとおりです:

ただし、結果をフィルタリングした場合はこのように実行できないことに注意してください

User::where('approved', 0)->chunk(100, function ($users) {
  foreach ($users as $user) {
    $user->update(['approved' => 1]);
  }
});

コードより 実行上、このステートメントはエラーを引き起こしません

しかし、ここでの問題は、ユーザーをapproved=0でフィルタリングし、データベース操作をapproved=1で実行することです

次のデータを 100 個のデータに分割すると、この時点でデータが変更されているため、1 ページのデータが失われます。

これは、エントリの半分だけを処理し、半分を除外することを意味します。

解決策:

Laravel 5.2 以降では、chunkById メソッドを使用できます。

Laravel 5.2 より前は、次のコードを参照できます。

while(User::where('approved', 0)->count() > 0) {
    User::where('approved', 0)->chunk(100, function ($users) {
      foreach ($users as $user) {
        $user->update(['approved' => 1]);
      }
    });
}

[関連する推奨事項: laravel ビデオチュートリアル ]

以上がLaravelのチャンクメソッドの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。