iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Modern Web

工作後才知道的後端 30 件小事系列 第 14

Laravel ChunkById

What is chunkById

分批把資料從資料庫中拉出來,而非一次全拉。

以訂單為例,使用範例如下:

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);

Why chunkById

那為什麼不直接 get()foreach 就好,還要多這一層?

$orders = Order::where('status', '>', 0)->get();// 直接 get!

if (!is_null($orders)) {
    foreach ($orders as $order) {
        // 看要對每筆訂單做什麼
    }
}

最直接的原因是這樣會一次把資料都載入記憶體,資料量如果很大,記憶體會不夠用。

chunk vs. chunkById

這兩個都是 Laravel 提供的 chunk 的方法,主要差別在於,如果資料撈出來是要更新再寫回資料庫,而非單純讀取,建議用 chunkById,不然每一次(chunk)更新後可能會影響下一次的撈取。

下面這個例子就是一邊更新一邊撈取,無窮迴圈。

Post::where('updated_at', '<', now())->chunk(1000, function ($post) {
    $post->update('updated_at', now());
});

Reference


上一篇
PHP 亂數產生介於 0 到 1 之間的浮點數
下一篇
什麼是 Webhook Signature
系列文
工作後才知道的後端 30 件小事20
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言