在Laravel中的chunk方法做什么用的,用法是怎样
Admin 2022-06-14 群英技术资讯 758 次浏览
在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条数据,而不是整个表。
这样就减轻的系统的压力。
2.需要注意的地方
本文重点来了:
但是要小心,有过滤结果的不能像这样运行
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]); } }); }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
获取GET数据的方法使用PHP的内置变量$_GET。GET方法传输的数据都在URL中,比如"www.register.com:/up.php?name=frogjie&age=24"中的name和age参数。GET传输的数据是urlencode之后的。当请求到达php这边时,php会自动urldecode,并把这些参数以key=>value的方式保存到$_GET数组中。但是G
本篇文章给大家带来了关于Laravel请求声明周期的相关知识,请求生命周期有不同的术语,如自动加载器、内核、服务提供器、调度请求和路由等,希望对大家有帮助。
swoole中有两大进程,分别是master主进程和manager管理进程。其中master主进程中会有一个主reactor线程和多个reactor线程,主要的作用就是用来维护TCP连接,处理网络IO,收发数据。
本文实例讲述了php实现的证件照换底色功能。分享给大家供大家参考,具体如下,
php数组array_multisort()函数的介绍:1、返回排名组。可以输入一个或多个组。函数首先对第一个数组进行排序,其次是其他数组。2、注意,作为参数的数组元素个数应保持一致,否则会报错。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008