2017-04-05 15 views

答えて

1
User::where('is_active', true)->chunk(500, function (Collection $users) { 
    $users->each(function (User $user) { 
     // Do per-user stuff here 
    }); 
    // Do per-chunk stuff here 
} 

これはトリックを行う必要があります。このような何かを行います。最後のチャンクには500人以下のユーザーが含まれている可能性があります。正確に500にする必要がある場合は、コレクションのサイズを確認してください。

User::where('is_active', true)->chunk(500, function (Collection $users) { 
    $users->each(function (User $user) { 
     // Do per-user stuff here 
    }); 
    if ($users->count() == 500) { 
     // Do per-chunk stuff here 
    } 
} 

これが役に立ちます。

+0

私はあなたがそれをテストしたのだろうか?フードの 'each()'は 'chunk()'を呼び出すので、あなたのコードは 'chunk()はchunk()を呼び出すeach()を呼び出すようです。 –

+1

私はそれをテストしました。 'each()'は 'chunk()'を呼び出しますが、 'chunk()'は 'each()'を呼び出さないことは間違いありません。 'chunk()'を直接呼び出すことで、コールバック引数を制御することができます。 – Sydgren

0

each()ヘルパーを使用する場合は、手動で行う必要があります。

$counter = 0; 
$chunk = 500; 

User::where('is_active', true)->each(function (User $user) use(&$counter, $chunk) { 
    // Do stuff for each user. 

    $counter += 1; 
    if ($counter === $chunk) { 
     $counter = 0; 
     // Do something after each chunk. 
     $this->doSomething(); 
    } 
}, $chunk); 

if (!$counter) 
    // Do something for the last chunk. 
    $this->doSomething(); 
} 
+0

本当に正しいものを使いたいのですが、 '$ counter'変数が必要ないものがあれば、私が試したものだけです。 – jycr753

+1

@ jycr753私は 'each()'と 'chunk()'ソースコードを調べましたが、現時点ではもっと良い解決策はありません。 –

+0

ええ、私はあまりにも、それは私がここで尋ねた理由です...多分ちょうど多分ちょうど誰かがそれのためのより良い/速い/賢いアプローチを知っていたかもしれません – jycr753

関連する問題