bogddan/laracsv

一个用于轻松从Eloquent模型生成CSV文件的Laravel包。

dev-master 2023-07-12 13:31 UTC

This package is auto-updated.

Last update: 2024-09-12 15:51:45 UTC


README

一个用于轻松从Eloquent模型生成CSV文件的Laravel包。

Build Status Total Downloads Daily Downloads

基本用法

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

然后,将下载包含emailname字段的适当CSV文件。听起来很简单!

安装

只需在您的终端运行此命令

composer require usmanhalalit/Bogddan:^2.1

然后您就可以开始了。

完整文档

构建CSV

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

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

输出选项

下载

将文件下载到浏览器

$csvExporter->download();

如果您希望提供文件名,则可以提供

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

如果没有提供文件名,将生成一个包含日期时间的文件名。

高级输出

Bogddan使用League CSV。您可以执行League CSV能够执行的操作。您可以通过调用

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

来获取底层的League CSV写入器和读取器实例

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

然后您可以执行多个操作,例如

自定义标题

有关更多信息,请参阅League 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 \Bogddan\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 \Bogddan\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许可。