乐趣区

关于thinkphp6:一个thinkphp包可以轻松地从Eloquent模型生成CSV文件

装置

composer require whereof/think-csv

根本用法

$users = User::select(); // All users
$csvExporter = new \whereof\think\csv\Export();
$csvExporter->build($users, ['email', 'name'])->download();

建设 CSV

$exporter->build($modelCollection, $fields)须要三个参数。第一个是模型(模型的汇合),第二个是要导出的字段名称,第三个是配置,这是可选的。

$csvExporter->build(User::select(), ['email', 'name', 'created_at']);

输入选项

下载

要将文件下载到浏览器:

$csvExporter->download();

如果您违心,能够提供文件名:

$csvExporter->download('active_users.csv');

如果没有给出文件名,则将生成带有日期工夫的文件名。

高级输入

LaraCSV 应用 League CSV。您能够做 League CSV 能做的事件。您能够通过调用获取底层 League CSV writer 和 reader 实例:

$csvWriter = $csvExporter->getWriter();
$csvReader = $csvExporter->getReader();

而后你能够做几件事,比方:

$csvString = $csvWriter->getContent(); // To get the CSV as string
$csvReader->jsonSerialize(); // To turn the CSV in to an array

无关更多信息,请查看 League CSV 文档。

自定义题目

下面的代码示例将生成一个带有题目电子邮件、名称、created_at 和前面的相应行的 CSV。

如果要应用自定义标签更改题目,只需将其作为数组值传递:

$csvExporter->build(User::select(), ['email', 'name' => 'Full Name', 'created_at' => 'Joined']);

当初 name 列将显示题目,Full Name但它依然会从 name 模型的字段中获取值。

无标题

您还能够勾销 CSV 标头:

$csvExporter->build(User::select(), ['email', 'name', 'created_at'], ['header' => false,]);

批改或增加值

在解决数据库行之前会触发一个钩子。例如,如果您想更改日期格局,您能够这样做。

$csvExporter = new \Laracsv\Export();
$users = User::get();

// Register the hook before building
$csvExporter->beforeEach(function ($user) {$user->created_at = date('f', strtotime($user->created_at));
});

$csvExporter->build($users, ['email', 'name' => 'Full Name', 'created_at' => 'Joined']);

留神:如果 beforeEach 回调返回,false则整行将从 CSV 中排除。过滤一些行会很不便。

增加字段和值

您还能够增加数据库表中不存在的字段并动静增加值:

// The notes field doesn't exist so values for this field will be blank by default
$csvExporter->beforeEach(function ($user) {
    // Now notes field will have this value
    $user->notes = 'Add your notes';
});

$csvExporter->build($users, ['email', 'notes']);

分块构建

对于可能会耗费更多内存的较大数据集,能够应用构建器实例以块的模式处理结果。相似于行相干的钩子,在这种状况下能够应用块相干的钩子,例如急迫加载或相似的基于块的操作。两个钩子之间的行为是类似的;它在每个块之前被调用,并将整个汇合作为参数。如果 false 返回,整个块被跳过,代码持续下一个。

// Perform chunk related operations
$export->beforeEachChunk(function ($collection) {});
$export->buildFromBuilder(User::newQuery(),['email', 'name']);
$export->buildFromBuilder(Db::table('user'),['email', 'name']);

默认块大小设置为 1000 个后果,但能够通过在 $config 传递给buildFromBuilder. 示例将块大小更改为 500。

$export->buildFromBuilder(User::newQuery(),['email', 'name'], ['chunk' => 500]);
退出移动版