这篇文章主要介绍“laravel的chunk方法如何用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel的chunk方法如何用”文章能帮助大家解决问题。在laravel中,chunk()方
这篇文章主要介绍“laravel的chunk方法如何用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“laravel的chunk方法如何用”文章能帮助大家解决问题。
在laravel中,chunk()方法用于将集合分割为多个指定大小的较小集合,语法为“$指定集合->chunk(指定数量);”;该方法会对各个用户数据进行更新后再查看各个用户数据,这样在查询数据时没有获取大量数据,能够减轻系统的压力。
本文操作环境:windows10系统、Laravel6版、Dell G3电脑。
chunk()
chunk 方法将集合分割为多个给定大小的较小集合。将集合显示到网格中非常有用。
$prices = collect([18, 23, 65, 36, 97, 43, 81]);$prices = $prices->chunk(3);$prices->toArray();
以上代码生成效果。
[ 0 => [ 0 => 18, 1 => 23, 2 => 65 ], 1 => [ 3 => 36, 4 => 97, 5 => 43 ], 2 => [ 6 => 81 ]]
常规使用
如果有一个这样的需求:对数据库的全部数据查询出来,进行一系列更新
简单粗暴的方法是 把查询到的全部数据,使用foreach进行操作,然后再存入数据库。
$users = User::all();foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]);}
如果数据非常宠大,系统可能会耗尽内存,这个方法显然很笨拙。
Laravel 为此提供了一个简洁的解决方案
Laravel 的 chunk 方法可以将集合拆成多个指定大小的小集合
User::chunk(100, function ($users) { foreach ($users as $user) { $some_value = ($user->some_field > 0) ? 1 : 0; $user->update(['some_other_field' => $some_value]); }});
以上代码运行的原理是:
运行一个 chunk ,这个 chunk 查出100个用户数据,对各个用户数据进行更新
然后再查看100个用户数据,再执行更新操作,依此类推。
这意味着在查询数据时不会从数据库中获取大量数据,每次查询100条数据,而不是整个表。
这样就减轻的系统的压力。
需要注意的地方
本文重点来了:
但是要小心,有过滤结果的不能像这样运行
User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); }});
从代码执行上讲,这个语句并不会引发任何错误
但是这里的问题是,您要过滤approved=0的用户,执行approved=1的数据库操作
然后chunk下一个100条数据,此时数据已经更改,您将错过一页数据。
这意味着您将只处理一半的条目,还有一半漏掉了。
解决方案:
在 Laravel 5.2 之后可以使用 chunkById 方法
在 Laravel 5.2 之前可以参考以下代码
while(User::where('approved', 0)->count() > 0) { User::where('approved', 0)->chunk(100, function ($users) { foreach ($users as $user) { $user->update(['approved' => 1]); } });}
关于“laravel的chunk方法如何用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。
--结束END--
本文标题: laravel的chunk方法如何用
本文链接: https://lsjlt.com/news/331508.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0