Laravel中chunk组块结果集管理,Laravel中的chunk组块结果集管理与注意难点

ca88会员登录中心

前言

要是您须求管理不知凡多少个 Eloquent
结果,能够运用chunk命令。chunk方法会获取几个“组块”的 Eloquent
模型,并将其填充到给定闭包进行拍卖。使用chunk格局能够在管理多量数据集合时能够使得收缩内部存款和储蓄器消耗:

若果您供给管理成千上万个 Eloquent
结果,能够使用 chunk 命令。chunk 方法会获取二个“组块”的 Eloquent
模型,并将其填充到给定闭包进行拍卖。使用 chunk 方法能够在处理多量数据群集时能够行得通裁减内部存款和储蓄器消耗:

万一你必要管理不知凡几个 Eloquent 结果,能够行使 chunk 命令。chunk
方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包实行管理。使用
chunk 方法能够在拍卖大批量数码集合时能够行得通削减内部存款和储蓄器消耗:

Flight::chunk(200, function  {    foreach ($flights as $flight) {        //    }});

        $all_ark=Arkvolume::chunk(50000, function  {            foreach ($flights as $flight) {               $GLOBALS['something'][] = $flight['id'];            }        });        var_dump($GLOBALS['something'] );exit;
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;
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条的数码开始展览翻新,当施行到位后持续后边的另一百条数据……
也正是说他老是操作的是三个数量块而不是全部数据库。

  这段代码是实行一个100条的多少进行翻新,当施行到位后持续前面包车型地铁另第一百货公司条数据……
也等于说他每一遍操作的是七个数码块而不是一体数据库。

这段代码是进行一个100条的多寡进行更新,当施行到位后延续前边的另一百条数据……

要求专注的是:当使用带筛选的尺度的chunk时,借使是自立异,那么你会井底之蛙一些数目,接着看代码:

亟需留意的是:当使用带筛选的条件的chunk时,要是是自立异,那么你会管窥蠡测一些数目,接着看代码:

也正是说他每一回操作的是二个数据块而不是全部数据库。

User::where('approved', 0)->chunk(100, function  {  foreach ($users as $user) {    $user->update(['approved' => 1]);  }});
User::where('approved', 0)->chunk(100, function ($users) {
  foreach ($users as $user) {
    $user->update(['approved' => 1]);
  }
});

亟需小心的是:当使用带筛选的条件的chunk时,如果是自立异,那么您会盲人摸象一些数目,接着看代码:

  

  

User::where('approved', 0)->chunk(100, function ($users) {
 foreach ($users as $user) {
 $user->update(['approved' => 1]);
 }
});

若果要运维方面包车型客车代码,并不会有报错,不过where原则是筛选approved0user然后将approved的值跟新为1
在这些进程中,档第一数据库的数量被退换后,下二个数据块的数目将是在被涂改后的数码中选出来的,那个时候数据变了,而page也加了1。所以进行达成后,只对数据中四分之二的多少开展了履新操作。

若果要运维方面包车型地铁代码,并不会有报错,可是where原则是筛选approved0user然后将approved的值跟新为1
在那一个历程中,档第一数据库的数额被修改后,下叁个数据块的数额将是在被更改后的多少中选出来的,那年数据变了,而page也加了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事先的数码
今后照旧。

要是未有知道的话,咱们来看一下chunk的最底层完毕。还以上面包车型大巴代码为例,倘诺一共有400条数据,数据被依据100条进行分块管理。
page = 1: 最起首的时候page为1,选拔1-100条数据开始展览管理;
page = 2:
那时候前一百数额的approved值全体为1,那么在次筛选的时候数据将从第101条初叶,近日年的page=2,那么管理的数目将是第200-300事先的数码
其后照旧。

一旦未有明白的话,我们来看一下chunk的平底完成。还以上边的代码为例,若是一共有400条数据,数据被根据100条进行分块管理。

public function chunk($count, callable $callback){    $results = $this->forPage($page = 1, $count)->get();    while (count > 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;}
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;
}

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;
}

Laravel chunk 使用注意的难点

动用 Laravel 的 chunk
能够用来优化大结果集的询问,提供分块管理数量的点子,可是正如的例子就能够有标题:

User::where('approved', 0)->chunk(100, function ($users) {
 foreach ($users as $user) {
 $user->update(['approved' => 1]);
 }
});

案由在于第壹次询问:

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

update 这一堆数量的 approved 为 1 过后,

再看第三次查询:

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

本条时候因为有 where approved = 0 条件还要偏移量从 100
初叶,那样实在就漏掉了 100 条 approved 为 0 的多少。

之所以,我们要幸免采用 chunk 的时候,改换和过滤条件的字段的值。

总结

如上正是那篇文章的全部内容了,希望本文的原委对大家的上学或许职业有着一定的参阅学习价值,要是有疑点我们能够留言交换,多谢大家对台本之家的支撑。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图