Scott Robinson Technical Lead

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.

Found this useful? Everything here is free and stays that way. If it saved you an afternoon, you can buy me a coffee.