前言

如果你需要处理成千上万个 Eloquent 结果,可以使用 chunk 命令。chunk 方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理。使用 chunk 方法能够在处理大量数据集合时能够有效减少内存消耗:

PHP;">

Flight::chunk(200,function ($flights) {

foreach ($flights as $flight) {

//

}

});

$all_ark=Arkvolume::chunk(50000,function ($flights) {

foreach ($flights as $flight) {

$GLOBALS['something'][] = $flight['id'];

}

});

var_dump($GLOBALS['something'] );exit;

这段代码是执行一个100条的数据进行更新,当执行完成后继续后面的另一百条数据……

也就是说他每次操作的是一个数据块而不是整个数据库。

需要注意的是:当使用带筛选的条件的chunk时,如果是自更新,那么你会漏掉一些数据,接着看代码:

chunk(100,function ($users) {

foreach ($users as $user) {

$user->update(['approved' => 1]);

}

});

如果要运行上面的代码,并不会有报错,但是where条件是筛选approved为0的user然后将approved的值跟新为1。

在这个过程中,档第一数据库的数据被修改后,下一个数据块的数据将是在被修改后的数据中选出来的,这个时候数据变了,而page也加了1。所以执行结束后,只对数据中一半的数据进行了更新操作。

如果没有明白的话,我们来看一下chunk的底层实现。还以上面的代码为例,假如一共有400条数据,数据被按照100条进行分块处理。

page = 1: 最开始的时候page为1,选取1-100条数据进行处理;

page = 2: 这时候前一百数据的approved值全部为1,那么在次筛选的时候数据将从第101条开始,而这个时候的page=2,那么处理的数据将是第200-300之前的数据

之后依旧。

forPage($page = 1,$count)->get();

while (count($results) > 0) {

// On each chunk result set,we will pass them to the callback and then let the

// developer take care of everything within the callback,which allows us to

// keep the memory low for spinning through large result sets for working.

if (call_user_func($callback,$results) === false) {

return false;

}

$page++;

$results = $this->forPage($page,$count)->get();

}

return true;

}

Laravel chunk 使用注意的问题

使用 Laravel 的 chunk 可以用来优化大结果集的查询,提供分块处理数据的方法,但是如下的例子就会有问题:

update(['approved' => 1]);

}

});

原因在于第一次查询:

sql;">

select * from users where approved = 0 limit 100 offset 0;

update 这一批数据的 approved 为 1 之后,

再看第二次查询:

sql;">

select * from users where approved = 0 limit 100 offset 100;

这个时候因为有 where approved = 0 条件并且偏移量从 100 开始,这样其实就漏掉了 100 条 approved 为 0 的数据。

所以,我们要避免使用 chunk 的时候,更改和过滤条件的字段的值。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

mysql chunk 函数_Laravel中的chunk组块结果集处理与注意问题相关推荐

  1. mysql getnum函数_Mysql中实现提取字符串中的数字的自定义函数分享

    因需要在MysqL的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的MysqL函数,可以有效的从字符串中提取出数字. 该MysqL提取出字符串中的数字函数如下: CREATE ...

  2. php mysql ifnull函数_MYSQL中的IFNULL函数

    手册上: IFNULL(expr1,expr2) 假如expr1不为NULL,则IFNULL()的返回值为 expr1;否则其返回值为 expr2.IFNULL()的返回值是数字或是字符串,具体情况取 ...

  3. mysql算法函数_mysql中的函数总结

    mysql中常用日期时间函数 MySQL服务器中的三种时区设置: ①系统时区---保存在系统变量system_time_zone ②服务器时区---保存在全局系统变量global.time_zone ...

  4. mysql创建函数1418_Mysql中创建函数报“ERROR 1418 ”的解决方法

    我们在使用mysql数据库开发项目的时候,有时Mysql系统自带的函数不能完全满足我们开发的需要,解决方法是自己创建函数,可以有可能在你创建函数的过程事会报出Error 1418错误,对于报这种错误的 ...

  5. mysql开窗函数over_sql中的开窗函数over()

    今天刷LeetCode的时候看到一道题,题目是这个样子 LeetCode上面要求是用mysql来解决这道题,因为平时我上班的时候大部分时间都是在sqlserver上操作,所以一看到这个题目的要求我脑海 ...

  6. mysql olap 函数_Mysql中的窗口函数

    窗口函数初识 窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据进行实时分析处理.窗口函数和group by有类似之处,其区别在于窗口会对 ...

  7. mysql explode函数_hive中,lateral view 与 explode函数

    hive中常规处理json数据,array类型json用get_json_object(#,"$.#")这个方法足够了,map类型复合型json就需要通过数据处理才能解析. exp ...

  8. mysql diff函数_MYSQL中 的datediff、timestampdiff函数

    对mysql中日期范围搜索的大致有三种方式: 1.between and语句: 2.datediff函数: 3.timestampdiff函数: 下面就具体说明下这三种方式: 第一种: between ...

  9. mysql pmt函数,Mybatis中Oracle和Mysql的Count字段问题

    Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...

  10. mysql group函数_mysql中group_concat函数的使用

    一.group_concat函数的功能 将group by产生的同一个分组中的值连接起来,返回一个字符串结果. group_concat函数首先根据group by指定的列进行分组,将同一组的列显示出 ...

最新文章

  1. opencv处理dicom图像_图像处理|opencv| 利用opencv把照片变换成素描风格
  2. 微型计算机的什么接口主要作为打印机接口,微型计算机及其接口技术试题及答案(2006年10月)...
  3. 动态矩阵控制matlab程序_【实时关注】你了解MATLAB吗?
  4. [patl2-001]紧急救援
  5. python引入redis_使用python向Redis批量导入数据
  6. 保姆级教学:缓存穿透、缓存击穿和缓存雪崩!
  7. 演练 青鸟游戏迷你平台
  8. 随机模拟的基本思想和常用采样方法(sampling)
  9. ★★iPhone越狱后必装软件和一些心得教程,送给广大的小白们,希望你们能从小白变成“小黑”★★
  10. 外螺纹对照表_螺纹螺距对照表
  11. html内外边距区别,css水平边距和垂直边距 css中的内边距和外边距?
  12. Hadoop实战第2版 - 电子书下载(高清版PDF格式+EPUB格式)
  13. php strtolower 大写,PHP strtolower()用法及代码示例
  14. 【CST】贴片天线阵列设计
  15. 什么是SEM?SEM是否包括SEO?
  16. xshell 6+xftp 6卸载时出现1628错误解决办法
  17. 用ADC0809实现八通道采集
  18. GitHub 上值得收藏的100个精选前端项目!你知道几个?
  19. 已经围上为何不算目_有答案的小学语文教师教材过关考试模拟试卷1
  20. C++别踩白块小游戏

热门文章

  1. 《非暴力沟通》的优秀读后感2600字
  2. [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  3. 【Java安全技术探索之路系列:Java可扩展安全架构】之八:JCP(一):JCP架构介绍
  4. 传统软件厂商生存模式推演
  5. 仿小米商城网: 项目启动
  6. 5990.8亿,一个如约而来的重大项目
  7. uniapp猫眼电影小程序(附带猫眼电影api接口)
  8. os系统服务器防火墙怎么关闭,mac防火墙如何关闭
  9. 9张图揭秘:优秀的数据分析项目,这样做!
  10. mac系统更新后无法打开axure8/9