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


<<:  【第十四天 - Linked list介绍】

>>:  Day 13:摆放控制项(二)

Day 07 关键字分析工具介绍

我们前面几章提到关键字的规划原则,我们都很有共识,关键字是要依据潜在消费者的搜寻需求所拟定出来的。 ...

D30 - Python入门挑战end?!

铁人赛只有30天该高兴还是觉得累 哈哈哈 总之顺利度过了 这次的课程进度走一个没很紧绷 但是也是有顺...

NNI如何搬到Colab01

NNI搬到Colab上,环境类似本机。虽然,NNI很容易搬到Colab平台上,但由於Colab并不公...

关於 background 属性

background 也是速记属性,可由以下属性值组成: background-attachment...

2.4.10 Design System - Input Text

以前我绝对是对哲学避之唯恐不及的 但某一年意外看到「正义 一场思辨之旅」以及「超译 尼采」後 开始...