使用chunkById方法时为什么不要进行排序

  介绍

这篇文章给大家分享的是有关使用chunkById方法时为什么不要进行排序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

<强>使用chunkById方法的时候请不要进行排序

最近在做开发任务的时候碰到了个诡异的问题,于是分享给大家

<强>问题说明

由于需要批量处理数据,并且这个数据的量很大,一次全部取出然后执行是不现实的,幸运的是Laravel为我们提供了chunkById方法来让我们方便的处理。伪代码如下

学生::查询()   ,,,,,(& # 39;is_delete& # 39;,,假)   ,,,→orderBy (& # 39; id # 39;,, & # 39; desc # 39;)   ,,,→chunkById(200年,函数(学生),{   ,,,,,,,,,,,//,在这里进行逻辑处理   ,,,});

咋一眼看上去,并没有什么问题,但是实际执行代码的时候会发现chunkById只会执行第一次,第二次以后由于某种原因会停止执行。

<强>查找原因

Laravel的源码中chunkById代码如下

,,public  function  chunkById(数美元,callable 调,美元,美元column =, null,, alias 美元;=,null)   ,,,{   ,,,,,,,column 美元;=,is_null(列),?,这→美元getModel ()→getKeyName(),:,美元列;   ,,,,,,,alias 美元;=,is_null(别名),?,column 美元;:,别名美元;   ,,,,,,,lastId 美元;=,空;   ,,,,,,,do  {   ,,,,,,,,,,,clone 美元;=,clone 美元;   ,,,,,,,,,,,results 美元;=,克隆→美元forPageAfterId(数美元,lastId美元,美元列)→();   ,,,,,,,,,,,countResults 美元;=,结果→美元数();   ,,,,,,,,,,,if  (countResults 美元;==,0),{   ,,,,,,,,,,,,,,,休息;   ,,,,,,,,,,,}   ,,,,,,,,,,,if (回调(结果)美元美元,===,false), {   ,,,,,,,,,,,,,,,return 假;   ,,,,,,,,,,,}   ,,,,,,,,,,,lastId 美元;=,结果→美元去年()→{$别名};   ,,,,,,,,,,,设置($ results);   ,,,,,,,},while  (countResults 美元;==,美元数);   ,,,,,,,return 真实;   ,,,}

看起来没什么问题,由于而循环是根据countResults==美元计数来判断的,那么我们转储一下这两个变量就会发现,第一次这两个是一致的,第二次由于数据不一致导致程序停止。

在上面的代码中,美元计算是由结果=克隆→美元forPageAfterId(计数,lastId美元,美元列)→();来获得的,

继续查看forPageAfterId方法

public  function  forPageAfterId ($ perPage =, 15日,lastId 美元;=,0,,column 美元;=,& # 39;id # 39;)   {   ,,,这个→美元orders =, $ this→removeExistingOrdersFor($列);   ,,,if  (!, is_null (lastId美元)),{   ,,,,,,,这个→美元,(列,美元,& # 39;祝辞& # 39;,,lastId美元);   ,,,}   ,,,return  $ this→orderBy(列,美元,& # 39;asc # 39;)   ,,,,,,,,,,,,,,,→(perPage美元);   }

我们可以看的到,在这里返回的结果是orderBy进行升序排列的,而我们的原始代码是进行降序排列,就会导致数不一致,从而使chunkById结束执行。

<强>解决方案

把之前的orderBy (& # 39; id # 39; & # 39; desc # 39;)移除即可。

学生::查询()   ,,,,,(& # 39;is_delete& # 39;,,假)   ,,,→chunkById(200年,函数(学生),{   ,,,,,,,,,,,//,在这里进行逻辑处理   ,,,});

感谢各位的阅读!关于“使用chunkById方法时为什么不要进行排序”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

使用chunkById方法时为什么不要进行排序