使用chunkById方法时请不要进行排序!
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用chunkById方法时请不要进行排序!,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2287字,纯文字阅读大概需要4分钟。
内容图文
下面由Laravel教程栏目给大家介绍使用chunkById方法时请不要进行排序!,希望对需要的朋友有所帮助!使用 chunkById 方法的时候请不要进行排序
最近在做开发任务的时候碰到了个诡异的问题,于是分享给大家
问题说明
由于需要批量处理数据,并且这个数据的量很大,一次全部取出然后执行是不现实的,幸运的是 Laravel 为我们提供了 chunkById 方法来让我们方便的处理。伪代码如下
Student::query() ->where('is_delete', false) ->orderBy('id', 'DESC') ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
咋一眼看上去,并没有什么问题,但是实际执行代码的时候会发现 chunkById 只会执行第一次,第二次以后由于某种原因会停止执行。
查找原因
Laravel 的源码中 chunkById 代码如下
public function chunkById($count, callable $callback, $column = null, $alias = null) { $column = is_null($column) ? $this->getModel()->getKeyName() : $column; $alias = is_null($alias) ? $column : $alias; $lastId = null; do { $clone = clone $this; $results = $clone->forPageAfterId($count, $lastId, $column)->get(); $countResults = $results->count(); if ($countResults == 0) { break; } if ($callback($results) === false) { return false; } $lastId = $results->last()->{$alias}; unset($results); } while ($countResults == $count); return true; }
看起来没什么问题,由于 while 循环是根据 $countResults == $count 来判断的,那么我们 dump 一下这两个变量就会发现, 第一次这两个是一致的,第二次由于数据不一致导致程序停止。
在上面的代码中, $count 是由 $results = $clone->forPageAfterId($count, $lastId, $column)->get(); 来获得的,
继续查看 forPageAfterId 方法
public function forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') { $this->orders = $this->removeExistingOrdersFor($column); if (! is_null($lastId)) { $this->where($column, '>', $lastId); } return $this->orderBy($column, 'asc') ->take($perPage); }
我们可以看到,在这里返回的结果是 orderBy 进行升序排列的, 而我们的原始代码是进行降序排列,就会导致 count 不一致,从而使 chunkById 结束执行。
解决方案
把之前的 orderBy('id', 'desc') 移除即可。
Student::query() ->where('is_delete', false) ->chunkById(200, function($students) { // 在这里进行逻辑处理 });
总结
以后使用 chunkById 或者 chunk 方法的时候不要添加自定义的排序
骚到老,学到老。。。
以上就是使用chunkById方法时请不要进行排序!的详细内容。
本文系统来源:https://www.php.cn/phpkj/laravel/462885.html内容总结
以上是互联网集市为您收集整理的使用chunkById方法时请不要进行排序!全部内容,希望文章能够帮你解决使用chunkById方法时请不要进行排序!所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。