usmanhalalit / laracsv
一个 Laravel 扩展包,可以轻松地从 Eloquent 模型生成 CSV 文件。
Requires
- php: >=7.1
- illuminate/database: >=5.2
- league/csv: ^9.0
Requires (Dev)
- fzaninotto/faker: ^1.8
- phpunit/phpunit: ^7.0
This package is auto-updated.
Last update: 2024-09-05 22:54:50 UTC
README
一个 Laravel 扩展包,可以轻松地从 Eloquent 模型生成 CSV 文件。
基本用法
$users = User::get(); // All users $csvExporter = new \Laracsv\Export(); $csvExporter->build($users, ['email', 'name'])->download();
您将会下载一个包含 email
和 name
字段的合适 CSV 文件。听起来很简单!
安装
只需在您的终端运行以下命令
composer require usmanhalalit/laracsv:^2.1
然后您就可以开始使用了。
完整文档
构建 CSV
$exporter->build($modelCollection, $fields)
接受三个参数。第一个是模型(模型集合),第二个是您想要导出的字段名,第三个是配置,这是可选的。
$csvExporter->build(User::get(), ['email', 'name', 'created_at']);
输出选项
下载
要下载文件到浏览器
$csvExporter->download();
您可以提供所需的文件名
$csvExporter->download('active_users.csv');
如果没有提供文件名,将生成带有日期时间的文件名。
高级输出
LaraCSV 使用 League CSV。您可以做 League CSV 能够做到的所有事情。您可以通过调用来获取底层的 League CSV 写入器和读取器实例
$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 文档。
自定义标题
上面的代码示例将生成一个包含标题 email、name、created_at 以及相应行的 CSV 文件。
如果您想更改标题为自定义标签,只需将其作为数组值传递
$csvExporter->build(User::get(), ['email', 'name' => 'Full Name', 'created_at' => 'Joined']);
现在 name
列将显示标题 Full Name
,但它仍然会从模型的 name
字段中获取值。
无标题
您还可以禁用 CSV 标题
$csvExporter->build(User::get(), ['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']);
模型关系
您还可以从相关数据库表中添加字段到 CSV,前提是模型已定义了关系。
这将获取产品标题和相关类别标题(一对一)
$csvExporter->build($products, ['title', 'category.title']);
您也可以通过钩子以您希望的方式调整关系
$products = Product::with('categories')->where('order_count', '>', 10)->orderBy('order_count', 'desc')->get(); $fields = ['id', 'title','original_price' => 'Market Price', 'category_ids',]; $csvExporter = new \Laracsv\Export(); $csvExporter->beforeEach(function ($product) { $product->category_ids = implode(', ', $product->categories->pluck('id')->toArray()); });
分块构建
对于大型数据集,这可能消耗更多内存,可以使用构建实例来分块处理结果。类似于与行相关的钩子,在这种情况下可以使用与块相关的钩子,例如预加载或类似的基于块的操作。这两个钩子的行为相似;在处理每个块之前都会被调用,并带有整个集合作为参数。如果返回 false
,则整个块将被跳过,代码继续处理下一个。
// Perform chunk related operations
$export->beforeEachChunk(function ($collection) {
$collection->load('categories');
});
$export->buildFromBuilder(Product::select(), ['category_label']);
默认块大小设置为 1000 个结果,但可以通过将不同的值传递到 buildFromBuilder
中的 $config
来更改。示例将块大小更改为 500。
// ... $export->buildFromBuilder(Product::select(), ['category_label'], ['chunk' => 500]);
© Muhammad Usman。许可协议:MIT。