家人们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;
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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

5个月前 评论
随波逐流

没有复现

5个月前 评论

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

5个月前 评论

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