为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel Excel 排队导出不会创造工作

Laravel Excel 排队导出不会创造工作

PHP
小唯快跑啊 2022-06-17 16:40:55
我正在尝试让排队的导出与 Laravel Excel 包一起使用,但无法弄清楚我缺少什么。我遵循了有关如何排队导出的文档,但是当我对其进行测试时,导出在第一批导出后完成,因此在前 1000 行之后。我将我的应用程序设置为使用.env 中的数据库驱动程序并生成/运行迁移。我正在使用 Laravel 5.8、Laravel Excel 3.1、PHP 7.2、Postgresql 10。这是我目前所拥有的基本版本:控制器public function export(Request $request){    $name = 'test.csv';    (new ExcelExport($client, $year))->queue('public/exports/' . $name)->chain([        new NotifyUserOfExport($request->user(), $name),    ]);    return back()->with('message', 'This export will take some time. You will receive an email when it is ready to download.');}出口类class ExcelExport implements FromQuery, WithHeadings, WithMapping, WithStrictNullComparison{    use Exportable;    public function __construct($client, $year)    {        $this->year = $year;        $this->client = $client;    }    public function query()    {        $query = $this->getQuery();        return $query;    }    public function headings(): array    {        //...    }    public function map($row): array    {        //....    }    private function getQuery()    {        return \DB::table('mytable')                  ->where('year', $this->year)                  ->where('client', $this->client)                  ->orderBy('created_at')                  ->groupBy('column');    }我的队列.phpreturn [    'default' => env('QUEUE_CONNECTION', 'sync'),    'connections' => [        'sync' => [            'driver' => 'sync',        ],        'database' => [            'driver' => 'database',            'table' => 'jobs', // also tried 'myschema.jobs'            'queue' => 'default',            'retry_after' => 90,        ],        //.....    ],我的 .envQUEUE_CONNECTION=database我认为没有任何其他相关的代码。我收到了应该在所有作业完成后发送的通知,但就像我之前提到的,它是在第一批完成后发送的。数据库中的作业表中也没有插入作业,因此存在问题。我只是无法弄清楚我错过了什么。我应该提到我不想使用Implicit Export queuing,因为同样的导出用于应用程序的另一部分,它只需要导出几行,所以我不需要排队。任何帮助,将不胜感激。
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

事实证明,因为我的查询有一个 groupBy 子句,我需要在导出类上实现自定义查询大小。我不明白为什么这是一个问题,但是在我添加之后,作业被添加到队列中并且处理得很好。所以我补充说:


    use Maatwebsite\Excel\Concerns\WithCustomQuerySize;


    class ExcelExport implements ...., WithCustomQuerySize


    //......


    public function querySize(): int

    {

        $query = //......


        $size = $query->count();

        return $size;

    }

我希望这对某人有所帮助,这样他们就不必经历我所做的头痛。


查看完整回答
反对 回复 2022-06-17
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

排队的可导出文件以块的形式处理;每个块都是由 QueuedWriter 推送到队列的作业。对于实现 FromQuery 问题的可导出文件,作业数是通过将 $query->count() 除以块大小来计算的。

#何时使用

根据 query() 方法的实现(例如,当使用 groupBy 子句时),前面提到的计算可能不正确。

如果是这种情况,您应该使用 WithCustomQuerySize 关注点来提供查询大小的自定义计算。

在此处阅读更多信息https://docs.laravel-excel.com/3.1/exports/queued.html#when-to-use


查看完整回答
反对 回复 2022-06-17
  • 2 回答
  • 0 关注
  • 185 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信