Customising Exports for the 'Laravel Nova Excel' Package
I recently worked on a project that needed an export for an Orders view within a Laravel Nova panel. If you have simple requirements, for example, exporting all fields with titles – that is relatively simple to produce. However, I needed to update fields and merge others with some other custom changes.
In short, I moved the export logic into its own Laravel Nova action called ExportOrders
. and added this into the Nova Resource actions like so:
namespace App\Nova;
use App\Nova\Actions\ExportOrders;
class Order extends Resource
{
// snipped..
/**
* Get the actions available for the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function actions(Request $request)
{
return [
(new ExportOrders())
];
}
}
Next, I created the above-named file at app/Nova/Actions/ExportOrders.php
to define the headings and map the fields to their corresponding export fields:
namespace App\Nova\Actions;
use App\Models\Order;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\LaravelNovaExcel\Actions\DownloadExcel;
class ExportOrders extends DownloadExcel implements WithMapping, WithHeadings
{
/**
* @return array
*/
public function headings(): array
{
return [
'internal_order_id',
'created_at',
'stripe_transaction_id',
'buyer_name',
'buyer_email',
'billing_address',
'delivery_name',
'delivery_address',
'giftcard_amount',
'total_paid',
'message',
'status'
];
}
/**
* @param $order
*
* @return array
*/
public function map($order): array
{
return [
$order->id,
$order->created_at,
$order->transaction_id,
$order->buyer_name,
$order->buyer_email,
$order->billing_address,
$order->recipient_name,
$order->delivery_address,
$order->amount,
$order->total,
$order->notes,
$order->status
];
}
}
Initially I’d added more functionality within this class to merge fields and add custom export but in the end, I decided to move a lot of these field customisations into Eloquent accessors instead. This meant that when they were accessed in the Nova panel, exports or anywhere else they became consistent.