PHP语言之Laravel中chunk组块集处理
小标 2018-08-02 来源 : 阅读 1149 评论 0

摘要:本文主要向大家介绍了PHP语言之Laravel中chunk组块集处理,通过具体的内容向大家展示,希望对大家学习php语言有所帮助。

本文主要向大家介绍了PHP语言之Laravel中chunk组块集处理,通过具体的内容向大家展示,希望对大家学习php语言有所帮助。

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

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时,如果是自更新,那么你会漏掉一些数据,接着看代码: 

User::where('approved', 0)->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之前的数据
之后依旧。


public function chunk($count, callable $callback)

{

    $results = $this->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;

}

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言PHP频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程