Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Datatables Buttons Laravel Package

yajra/laravel-datatables-buttons

Laravel DataTables Buttons plugin for server-side exports and printing. Adds CSV, Excel, PDF, and print support to yajra/laravel-datatables with DataTables Buttons integration. Works with Laravel 12+ and PHP 8.3+.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Install the package:
    composer require yajra/laravel-datatables-buttons:^13
    
  2. Publish assets/config (optional but recommended):
    php artisan vendor:publish --tag=datatables-buttons
    
  3. Ensure dependencies are installed:
    • yajra/laravel-datatables (required)
    • jQuery DataTables Buttons Extension (client-side)

First Use Case: Basic Export Button

// routes/web.php
Route::get('users/export', [UserDataTable::class, 'export']);
// app/DataTables/UserDataTable.php
use Yajra\DataTables\DataTables;
use Yajra\DataTables\Buttons;

class UserDataTable extends DataTables
{
    public function __construct()
    {
        $this->buttons([
            Buttons::export('Excel', 'Excel'),
            Buttons::export('CSV', 'CSV'),
        ]);
    }

    public function query()
    {
        return User::query();
    }
}
<!-- resources/views/users.blade.php -->
<script>
    $(document).ready(function() {
        $('#users-table').DataTable({
            processing: true,
            serverSide: true,
            ajax: '{!! route('users.datatable') !!}',
            buttons: [
                { extend: 'excel', title: 'Users Export' },
                { extend: 'csv', title: 'Users Export' }
            ]
        });
    });
</script>

Implementation Patterns

1. Button Configuration Patterns

Basic Export Buttons

$this->buttons([
    Buttons::export('Excel', 'Excel'),
    Buttons::export('CSV', 'CSV'),
    Buttons::export('PDF', 'PDF'),
    Buttons::print('Print', 'Print'),
]);

Custom Export Logic

$this->buttons([
    Buttons::make('customExport')
        ->className('btn btn-primary')
        ->action(function($query, $export) {
            return $query->get()->map(fn($user) => [
                'name' => $user->name,
                'custom_field' => $user->custom_field ?? 'N/A',
            ]);
        })
        ->exportOpenSingle(true)
        ->title('Custom Export'),
]);

Dynamic Button Visibility

$this->buttons([
    Buttons::export('Excel', 'Excel')
        ->visible(function() {
            return auth()->user()->can('export_users');
        }),
]);

2. Workflow: Exporting Related Models

// app/DataTables/OrderDataTable.php
public function query()
{
    return Order::with('customer')
        ->select('orders.*')
        ->query();
}

public function getCustomerName($order)
{
    return $order->customer->name;
}

public function getColumns()
{
    return [
        ['data' => 'id', 'name' => 'id'],
        ['data' => 'getCustomerName', 'name' => 'customer_name'],
        ['data' => 'amount', 'name' => 'amount'],
    ];
}

3. Integration with API Resources

// app/Http/Resources/UserResource.php
public function toArray($request)
{
    return [
        'id' => $this->id,
        'name' => $this->name,
        'email' => $this->email,
    ];
}

// app/DataTables/UserDataTable.php
public function query()
{
    return User::query()->with('roles');
}

public function getExportOptions()
{
    return [
        'columns' => [
            ['data' => 'id', 'name' => 'ID'],
            ['data' => 'name', 'name' => 'Name'],
            ['data' => 'email', 'name' => 'Email'],
            ['data' => 'roles.name', 'name' => 'Roles'],
        ],
    ];
}

4. Macros for Reusable Logic (v12.1.0+)

// app/Providers/DataTableServiceProvider.php
use Illuminate\Support\ServiceProvider;
use Yajra\DataTables\DataTables;

class DataTableServiceProvider extends ServiceProvider
{
    public function boot()
    {
        DataTables::macro('addAuditColumns', function($table) {
            $this->columns([
                ['data' => 'created_at', 'name' => 'Created At'],
                ['data' => 'updated_at', 'name' => 'Updated At'],
            ]);
            return $this;
        });
    }
}

// Usage:
$this->addAuditColumns($this)
     ->buttons([...]);

5. Handling Large Datasets

// app/DataTables/LogDataTable.php
public function query()
{
    return Log::query()
        ->select('id', 'user_id', 'action', 'created_at')
        ->orderBy('created_at', 'desc');
}

public function getExportOptions()
{
    return [
        'columns' => [
            ['data' => 'id', 'name' => 'ID'],
            ['data' => 'action', 'name' => 'Action'],
            ['data' => 'created_at', 'name' => 'Timestamp'],
        ],
        'chunk' => 1000, // Process in chunks
    ];
}

Gotchas and Tips

1. Common Pitfalls

Issue: Export Returns Empty File

  • Cause: Missing query() method or incorrect column mappings.
  • Fix:
    public function getColumns()
    {
        return [
            ['data' => 'id', 'name' => 'ID'], // Ensure 'data' matches query results
            ['data' => 'name', 'name' => 'Name'],
        ];
    }
    

Issue: "Column Not Found" Errors

  • Cause: Using exportRender() without defining the column in getColumns().
  • Fix:
    public function getColumns()
    {
        return [
            ['data' => 'id', 'name' => 'ID'],
            ['data' => 'getFormattedName', 'name' => 'Name'], // Must match method name
        ];
    }
    
    public function getFormattedName($user)
    {
        return ucfirst($user->name);
    }
    

Issue: PDF/Excel Styling Ignored

  • Cause: Using exportFormat without fast-excel or OpenSpout.
  • Fix (v13.1.0+):
    public function getExportOptions()
    {
        return [
            'excel' => [
                'exportFormat' => 'OpenSpout', // Defaults to OpenSpout in v13.1.0+
                'styles' => [
                    'font' => ['bold' => true],
                    'alignment' => ['horizontal' => 'center'],
                ],
            ],
        ];
    }
    

2. Debugging Tips

Log Export Queries

public function query()
{
    $query = User::query();
    \Log::debug($query->toSql(), $query->getBindings());
    return $query;
}

Inspect Export Data

public function getExportData()
{
    $data = $this->query()->get();
    \Log::info('Export Data:', $data->toArray());
    return $data;
}

Check Button Configuration

public function buttons()
{
    return [
        Buttons::export('Excel', 'Excel')
            ->className('btn btn-success')
            ->options([
                'title' => 'Custom Title',
                'modify' => true, // Enable customization
            ]),
    ];
}

3. Configuration Quirks

Overriding Defaults

// config/datatables-buttons.php
'buttons' => [
    'export' => [
        'excel' => [
            'title' => 'Laravel DataTables Export',
            'modify' => true,
        ],
    ],
],

Custom Assets Path

php artisan vendor:publish --tag=datatables-buttons --force
  • Update public_path() in config/datatables-buttons.php if assets are not loading.

4. Extension Points

Custom Export Actions

// routes/web.php
Route::get('users/export-custom', function() {
    $dataTable = new UserDataTable();
    return $dataTable->export('customExport');
});

Macroable DataTable (v12.1.0+)

// Register a macro globally
DataTables::macro('addCustomButton', function($button) {
    $this->buttons[] = $button;
    return $this;
});

// Usage:
$this->addCustomButton(Buttons::export('Excel', 'Excel'));

Enum Support (v13.2.0+)

use App\Enums\UserStatus;

public function getStatus($user)
{
    return UserStatus::from($user->status)->value;
}

public function getColumns()
{
    return [
        ['data' => 'getStatus', 'name' => 'Status'],
    ];
}

5. Performance Tips

Chunking for Large Exports

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport