这篇文章给大家分享的是有关使用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方法时为什么不要进行排序”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!