家人们chunkById 死循环

忽略把又复现不出来,估计是本地环境乱了

家人们我使用 chunkById 下载文件死循环了,但是换成chunk就好了,
我看chatgpt说我表里id不是连续的,我确实不是连续的,但是不应该死循环吧
求解答

        $builder = new Order()
        $date = date("y-m-d H-i-s");
        $fileName = "xxx_{$date}.csv";
        $response = new StreamedResponse(null, 200, [
            'Content-Type' => 'text/csv',
            'Content-Disposition' => 'attachment; filename='.$fileName,
        ]);

        $response->setCallback(function () use ($builder){
            $out = fopen('php://output', 'w');
            fwrite($out, chr(0xEF) . chr(0xBB) . chr(0xBF)); // 添加 BOM
            fputcsv($out,["xxx",]);
            $res = $builde
                ->chunkById(1000,function ($data)use (&$out){
                    $data = json_decode(json_encode($data), true);
                    foreach ($data as $item) {
                        fputcsv($out,$item);
                    }
                });
            fclose($out);
        });
        return $response;
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 11

查出来的数据id不是有序的话确实会有问题 但是死循环不会吧 你的id不是数字? 看起来是个order表 一边写入 一边还有数据插入的逻辑?

6个月前 评论
哪吒的狗腿子 (楼主) 6个月前

$builder->orderByAsc(‘ID’)->chunkById(…);

调用前先排序

6个月前 评论
Imuyu 6个月前
哪吒的狗腿子 (楼主) 6个月前

输出sql看看情况,这种一般就是获取到的最后一个ID有问题

6个月前 评论

file $builde应该是代码发错了? $out不用引用 还有这个文件导出,先直接fopen创建一个空文件再fopen打开写入下载要快些

6个月前 评论
sanders

建议把查询日志收集一下,从代码上看,除非你的 id 字段有1000条以上的重复数据,否则不应该死循环。

6个月前 评论

要换成 (clone $builder)->chunkById

6个月前 评论
随波逐流

没有复现

6个月前 评论

如果使用chunkById 首先确认表的主键是否是id如果不是则要在第二个参数指定主键字段

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!