分批把資料從資料庫中拉出來,而非一次全拉。
以訂單為例,使用範例如下:
use App\Models\Order;
$num_per_chunk = 500; // 每次拉 500 個
$column_as_id = 'order_id'; // 不給這個參數的話預設是會用主鍵(primary key)
Order::where('status', '>', 0)->chunkById($num_per_chunk, function($orders){
// 自己比較常遇到需要在搭配 foreach 對每個物件作操作
foreach ($orders as $order) {
// 看要對每筆訂單做什麼
}
}, $column_as_id);
那為什麼不直接 get()
再 foreach
就好,還要多這一層?
$orders = Order::where('status', '>', 0)->get();// 直接 get!
if (!is_null($orders)) {
foreach ($orders as $order) {
// 看要對每筆訂單做什麼
}
}
最直接的原因是這樣會一次把資料都載入記憶體,資料量如果很大,記憶體會不夠用。
這兩個都是 Laravel 提供的 chunk 的方法,主要差別在於,如果資料撈出來是要更新再寫回資料庫,而非單純讀取,建議用 chunkById
,不然每一次(chunk)更新後可能會影響下一次的撈取。
下面這個例子就是一邊更新一邊撈取,無窮迴圈。
Post::where('updated_at', '<', now())->chunk(1000, function ($post) {
$post->update('updated_at', now());
});