web-dev-qa-db-ja.com

Laravel Eloquentを使用したチャンクメソッド

大規模なデータベースを処理する場合、laravelはここにチャンクメソッドを提供します https://laravel.com/docs/5.1/queries#retrieving-results

しかし、このクエリでチャンクメソッドを使用するにはどうすればよいですか。

 $data = Inspector::latest('id')
                ->select('id', 'firstname', 'status', 'state', 'phone')
                ->where('firstname', 'LIKE', '%' . $searchtext . '%')
                ->get();

このようなjson応答を返すところ、

echo json_encode($data);

助言がありますか....

4
Aamir

私が理解しているように、chunk()メソッドは、大規模なデータセットを操作し、そのデータに対してアクションを実行する必要がある場合に使用しますチャンクごとにチャンク。

あなたの質問から、クエリを実行してからデータをJSONとして返すように聞こえるので、チャンクが必要なデータセットに対してアクションを実行しているようには思えません。

返されたJSONデータを分解する場合は、代わりに pagination を確認する必要があります。

次のようにクエリにページ分割を適用できます。

_$data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->paginate();
_

Paginateメソッドに数値を渡すことで、各セットのサイズを指定できます。

_$data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->paginate(25);
_

私が誤解していて、実際にチャンキングを実行したい場合は、次のことを実行できると思います。

_$data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->chunk(50, function($inspectors) {
        foreach ($inspectors as $inspector) {
            // apply some action to the chunked results here
        }
    });
_

また、雄弁なオブジェクトを返す場合は、自動的にjsonにキャストされるため、私が知る限り、json_encode()を実行する必要はありません。

[〜#〜]編集[〜#〜]

私があなたを完全に誤解し、あなたが実際にやりたいことはこれです:

_{ 1000 records } -> this is the result of your query
_

これに分割してください:

_{
    { 300 records},
    { 300 records},
    { 300 records},
    { 100 records},
}
_

次に、Collectionのチャンクメソッドが必要です。

_$data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->get() // now we're working with a collection
    ->chunk(300);
_

クエリの結果を取得するまでCollectionを操作していないので、chunk()を呼び出すだけの場合、コールバックが予期され、データセット全体に適用されます。 Eloquentを使用しています。

Collectionchunk()メソッドの詳細については、こちらをご覧ください。 https://laravel.com/docs/5.3/collections#method-chunk

それ以外の場合...実際に行っていることについて、もう少しコンテキストを説明できますか?本当にページネーションが必要なようです。 JSONデータで何をしていて、どのようにHTTPリクエストを呼び出しているのですか、それはajax経由ですか?なぜ1000件のレコード全体を一度に必要とするのですか?

1000のデータセット全体をクライアントに送信する必要があるが、一度に300が必要な場合は、チャンクを使用する必要はありません。雄弁な文脈でchunk()が何であるかを考えてください。データセット全体が揃うまで、チャンクを一度にクライアントにチャンクに戻すのではなく、アクションをチャンクに適用するためのものです。セット全体とそれを使用するポイントを返すのは、アクションを処理するためにセット全体をロードすることによって一度に多くのメモリを消費しないようにするためです。

データセット全体が少しずつ必要で、ページネーションがあなたのケースで機能しない場合(まだ理由がわかりません!)データを少しずつ取得して、それぞれに指定するために、HTTPリクエストを数回呼び出す必要があります。すでに持っているものと必要なものをリクエストします。

11
haakym

get()の代わりにchunk()を使用します。例えば。 chunk(100, function($data) {})

3
ToNy
  1. 変数$ counterを使用できます。そして、置きます
 
 if($ counter> = 100){break; } 
 
  1. ビューで呼び出すことができます
 
 use path/models/User; 
 Users-> chunk(100、function($ users){
 foreach($ users as $ user){
 //
} 
}); 
 
0
rizky redjo

チャンクはリクエストによるデータを返すためのものではなく、サーバー上の大きなテーブルを処理するためのものです-これはそれを使用する方法を示す簡単な例です(tested Laravel 5.7):

User::chunk(100, function($users) {
    foreach ($users as $user) {
        // processing
    }
});
0