Skip to content
A Laravel package to easily generate CSV files from Eloquent model
PHP
Branch: master
Clone or download

Latest commit

Latest commit 00e1eaf May 16, 2020

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Create FUNDING.yml Mar 14, 2020
src/Laracsv Missed some return void statements May 14, 2020
tests Add support for non array accessible classes by using collect + tests Feb 8, 2020
.gitignore
.travis.yml Add php 7.2 on travis Mar 27, 2019
LICENSE Test with custom delimeter Mar 31, 2019
README.md Add downloads badges Mar 31, 2019
composer.json Update PHP version needed Mar 27, 2019
phpunit.xml Upgrade to utilize league/csv 9.* Mar 27, 2019

README.md

LaraCSV

A Laravel package to easily generate CSV files from Eloquent model.

Build Status Total Downloads Daily Downloads

Basic usage

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

And a proper CSV file will be downloaded with email and name fields. As simple as it sounds!

Installation

Just run this on your terminal:

composer require usmanhalalit/laracsv:^2.0

and you should be good to go.

Full Documentation

Build CSV

$exporter->build($modelCollection, $fields) takes three parameters. First one is the model (collection of models), seconds one takes the field names you want to export, third one is config, which is optional.

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

Output Options

Download

To get file downloaded to the browser:

$csvExporter->download();

You can provide a filename if you wish:

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

If no filename is given a filename with date-time will be generated.

Advanced Outputs

LaraCSV uses League CSV. You can do what League CSV is able to do. You can get the underlying League CSV writer and reader instance by calling:

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

And then you can do several things like:

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

For more information please check League CSV documentation.

Custom Headers

Above code example will generate a CSV with headers email, name, created_at and corresponding rows after.

If you want to change the header with a custom label just pass it as array value:

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

Now name column will show the header Full Name but it will still take values from name field of the model.

No Header

You can also suppress the CSV header:

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

Modify or Add Values

There is a hook which is triggered before processing a database row. For example, if you want to change the date format you can do so.

$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']);

Note: If a beforeEach callback returns false then the entire row will be excluded from the CSV. It can come handy to filter some rows.

Add fields and values

You may also add fields that don't exists in a database table add values on the fly:

// 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']);

Model Relationships

You can also add fields in the CSV from related database tables, given the model has relationships defined.

This will get the product title and the related category's title (one to one):

$csvExporter->build($products, ['title', 'category.title']);

You may also tinker relation things as you wish with hooks:

$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());
});

© Muhammad Usman. Licensed under MIT license.

You can’t perform that action at this time.