LaraCSV
A Laravel package to easily generate CSV files from Eloquent model., (*1)
, (*2)
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., (*3)
Installation
Just run this on your terminal:, (*4)
composer require "usmanhalalit/laracsv:1.*@dev"
and you should be good to go., (*5)
Full Documentation
Build CSV
$exporter->build($modelCollection, $fields)
takes two parameters.
First one is the model (collection of models), and seconds one takes the field names
you want to export., (*6)
$csvExporter->build(User::get(), ['email', 'name', 'created_at']);
Output Options
Download
To get file downloaded to the browser:, (*7)
$csvExporter->download();
You can provide a filename if you wish:, (*8)
$csvExporter->download('active_users.csv');
You can also suppress the first line(heading):, (*9)
$csvExporter->build(User::get(), ['email', 'name', 'created_at'], false);
If no filename is given a filename with date-time will be generated., (*10)
Advanced Outputs
LaraCSV uses League CSV. You can do what League CSV
is able to do. You can get the underlying League CSV instance by calling:, (*11)
$csv = $csvExporter->getCsv();
And then you can do several things like:, (*12)
$csv->toHTML(); // To output the CSV as an HTML table
$csv->jsonSerialize()(); // To turn the CSV in to an array
$csv = (string) $csv; // To get the CSV as string
echo $csv; // To print the CSV
For more information please check League CSV documentation., (*13)
Above code example will generate a CSV with headers email, name, created_at and corresponding rows after., (*14)
If you want to change the header with a custom label just pass it as array value:, (*15)
$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., (*16)
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., (*17)
$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., (*18)
Add fields and values
You may also add fields that don't exists in a database table add values on the fly:, (*19)
// 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., (*20)
This will get the product title and the related category's title (one to one):, (*21)
$csvExporter->build($products, ['title', 'category.title']);
You may also tinker relation things as you wish with hooks:, (*22)
$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());
});
Road Map