richpeers/laravel-csv-export

将 Eloquent 查询构建器分块并返回 CSV,通过 Symfony 流式响应或保存

dev-master 2020-01-12 19:25 UTC

This package is auto-updated.

Last update: 2024-09-18 02:06:24 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

通过 Symfony StreamedResponse 或保存文件导出 CSV。传入 Eloquent 查询构建器以分块查询。

用法

使用 composer 安装

composer require richpeers/laravel-csv-export

创建一个扩展 ExportAbstract 并实现 ExportInterface 的类。以下是一个示例

<?php

namespace App\Services\CsvExports;

use RichPeers\LaravelCsvExport\ExportAbstract;
use RichPeers\LaravelCsvExport\ExportInterface;

class ExampleExport extends ExportAbstract implements ExportInterface
{
    /**
     * Array of csv column headers.
     * @return array
     */
    public function headers()
    {
        return [
            'Id',
            'Author name',
            'Title',
            'Created'
        ];
    }

    /**
     * Transform row values.
     * @param $value
     * @return array
     */
    public function values($value)
    {
        return [
            $value->id
            optional($value->author)->name ?? ' ',
            $value->title ?? ' ',
            $value->created_at->toDateString()
        ];
    }
}

控制器示例

<?php

namespace App\Http\Controllers;

use App\Models\Posts;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Services\CsvExports\ExampleExport;
use Symfony\Component\HttpFoundation\StreamedResponse;

class ExportController extends Controller
{
    /**
     * @param Request $request
     * @param ExampleExport $exportCsv
     * @return StreamedResponse
     */
    public function __invoke(Request $request, ExampleExport $exportCsv): StreamedResponse
    {
        // your eloquent query builder - best optimized
        $builder = Post::select('id', 'author_id', 'title', 'created_at')->with([
            'author' => function($author) {
                     $author->select('id', 'name')
                 }
            ])->filter($request);

        // return streamed csv file
        return $exportCsv->stream($builder);
    }
}

要保存 CSV 到文件,请使用 $exportCsv->file('path/to/file', '$builder); 代替