Step 1: Installing Laravel & DataTables
Jalankan perintah berikut pada terminal untuk mendownload dan menginstall project Laravel 10:
composer create-project laravel/laravel datatables-example
composer create-project laravel/laravel datatables-example
Setelah berhasil membuat project, kita akan install Laravel UI dan Yajra DataTables
composer require laravel/ui --dev
php artisan ui bootstrap --auth
composer require yajra/laravel-datatables
composer require laravel/ui --dev
php artisan ui bootstrap --auth
composer require yajra/laravel-datatables
Step 2: Setup Database
Setelah menginstall project Laravel, mari konfigurasi database terlebih dahulu.
Buka file .env. Lalu tambahkan detail database sebagai berikut:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama databasemu
DB_USERNAME=username databasemu
DB_PASSWORD=password databasemu
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama databasemu
DB_USERNAME=username databasemu
DB_PASSWORD=password databasemu
Step 3: Install Laravel DataTables Vite
Selanjutkan, kita akan install Laravel DataTables Vite untuk mempermudah setup sisi frontend.
npm i laravel-datatables-vite --save-dev
npm i laravel-datatables-vite --save-dev
Command diatas akan otomatis menginstall package-package berikut:
- Bootstrap Icons
- DataTables with Buttons and Select plugins for Bootstrap 5
- Laravel DataTables custom scripts
Setelah proses instalsi selesai, konfigurasi scripts dan css yang dibutuhkan oleh project kita.
import "./bootstrap";
import "laravel-datatables-vite";
import "./bootstrap";
import "laravel-datatables-vite";
// Fonts
@import url("https://fonts.bunny.net/css?family=Nunito");
// Variables
@import "variables";
// Bootstrap
@import "bootstrap/scss/bootstrap";
// DataTables
@import "bootstrap-icons/font/bootstrap-icons.css";
@import "datatables.net-bs5/css/dataTables.bootstrap5.min.css";
@import "datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css";
@import "datatables.net-select-bs5/css/select.bootstrap5.css";
// Fonts
@import url("https://fonts.bunny.net/css?family=Nunito");
// Variables
@import "variables";
// Bootstrap
@import "bootstrap/scss/bootstrap";
// DataTables
@import "bootstrap-icons/font/bootstrap-icons.css";
@import "datatables.net-bs5/css/dataTables.bootstrap5.min.css";
@import "datatables.net-buttons-bs5/css/buttons.bootstrap5.min.css";
@import "datatables.net-select-bs5/css/select.bootstrap5.css";
Selanjutnya jalankan vite development server agar dapat compile JS,CSS yang sudah kita setup.
npm run dev
npm run dev
Step 4: Setup DataTable Users
Buka terminal dan jalankan command berikut.
php artisan datatables:make Users
php artisan datatables:make Users
Selanjutnya kita akan konfigurasi UsersDataTable dan tambahkan kolom yang ingin ditampilkan.
namespace App\DataTables;
use App\Models\User;
use Illuminate\Database\Eloquent\Builder as QueryBuilder;
use Yajra\DataTables\EloquentDataTable;
use Yajra\DataTables\Html\Builder as HtmlBuilder;
use Yajra\DataTables\Html\Button;
use Yajra\DataTables\Html\Column;
use Yajra\DataTables\Services\DataTable;
class UsersDataTable extends DataTable
{
public function dataTable(QueryBuilder $query): EloquentDataTable
{
return (new EloquentDataTable($query))->setRowId('id');
}
public function query(User $model): QueryBuilder
{
return $model->newQuery();
}
public function html(): HtmlBuilder
{
return $this->builder()
->setTableId('users-table')
->columns($this->getColumns())
->minifiedAjax()
->orderBy(1)
->selectStyleSingle()
->buttons([
Button::make('add'),
Button::make('excel'),
Button::make('csv'),
Button::make('pdf'),
Button::make('print'),
Button::make('reset'),
Button::make('reload'),
]);
}
public function getColumns(): array
{
return [
Column::make('id'),
Column::make('name'),
Column::make('email'),
Column::make('created_at'),
Column::make('updated_at'),
];
}
protected function filename(): string
{
return 'Users_'.date('YmdHis');
}
}
namespace App\DataTables;
use App\Models\User;
use Illuminate\Database\Eloquent\Builder as QueryBuilder;
use Yajra\DataTables\EloquentDataTable;
use Yajra\DataTables\Html\Builder as HtmlBuilder;
use Yajra\DataTables\Html\Button;
use Yajra\DataTables\Html\Column;
use Yajra\DataTables\Services\DataTable;
class UsersDataTable extends DataTable
{
public function dataTable(QueryBuilder $query): EloquentDataTable
{
return (new EloquentDataTable($query))->setRowId('id');
}
public function query(User $model): QueryBuilder
{
return $model->newQuery();
}
public function html(): HtmlBuilder
{
return $this->builder()
->setTableId('users-table')
->columns($this->getColumns())
->minifiedAjax()
->orderBy(1)
->selectStyleSingle()
->buttons([
Button::make('add'),
Button::make('excel'),
Button::make('csv'),
Button::make('pdf'),
Button::make('print'),
Button::make('reset'),
Button::make('reload'),
]);
}
public function getColumns(): array
{
return [
Column::make('id'),
Column::make('name'),
Column::make('email'),
Column::make('created_at'),
Column::make('updated_at'),
];
}
protected function filename(): string
{
return 'Users_'.date('YmdHis');
}
}
Step 5: Setup a Users Controller, View & Route
Buatlah UsersController dengan menjalankan command berikut pada terminal.
php artisan make:controller UsersController
php artisan make:controller UsersController
Render datatables pada view users.index
namespace App\Http\Controllers;
use App\DataTables\UsersDataTable;
class UsersController extends Controller
{
public function index(UsersDataTable $dataTable)
{
return $dataTable->render('users.index');
}
}
namespace App\Http\Controllers;
use App\DataTables\UsersDataTable;
class UsersController extends Controller
{
public function index(UsersDataTable $dataTable)
{
return $dataTable->render('users.index');
}
}
Buatlah sebuah view users.index dan modifikasi seperti berikut.
@extends('layouts.app')
@section('content')
<div class="container">
<div class="card">
<div class="card-header">Manage Users</div>
<div class="card-body">
{{ $dataTable->table() }}
</div>
</div>
</div>
@endsection
@push('scripts')
{{ $dataTable->scripts(attributes: ['type' => 'module']) }}
@endpush
@extends('layouts.app')
@section('content')
<div class="container">
<div class="card">
<div class="card-header">Manage Users</div>
<div class="card-body">
{{ $dataTable->table() }}
</div>
</div>
</div>
@endsection
@push('scripts')
{{ $dataTable->scripts(attributes: ['type' => 'module']) }}
@endpush
Tambahkan rute baru pada routes/web.php
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UsersController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::get('/users', [UsersController::class, 'index'])->name('users.index');
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UsersController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::get('/users', [UsersController::class, 'index'])->name('users.index');
Set DataTable agar menggunakan vitejs secara default dengan cara mendaftarkan Builder::useVite() pada AppServiceProvider.
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Yajra\DataTables\Html\Builder;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Builder::useVite();
}
}
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Yajra\DataTables\Html\Builder;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Builder::useVite();
}
}
Selanjutnya, sekarang Kamu dapat menggunakan script tanpa perlu mengatur type ke module.
@extends('layouts.app')
@section('content')
<div class="container">
<div class="card">
<div class="card-header">Manage Users</div>
<div class="card-body">
{{ $dataTable->table() }}
</div>
</div>
</div>
@endsection
@push('scripts')
{{ $dataTable->scripts() }}
@endpush
@extends('layouts.app')
@section('content')
<div class="container">
<div class="card">
<div class="card-header">Manage Users</div>
<div class="card-body">
{{ $dataTable->table() }}
</div>
</div>
</div>
@endsection
@push('scripts')
{{ $dataTable->scripts() }}
@endpush
Setp 6: Update App Layout
Agar dapat menggunakan custom script, kita harus menambahkan @stack('scripts') sebelum penutup body tag pada app.blade.php layout.
....
<main class="py-4">
@yield('content')
</main>
</div>
@stack('scripts')
</body>
</html>
....
<main class="py-4">
@yield('content')
</main>
</div>
@stack('scripts')
</body>
</html>
Step 7: Migrasi dan Seed Test Data
php artisan migrate
php artisan tinker
php artisan migrate
php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.22 — cli) by Justin Hileman
>>> User::factory(100)->create()
Psy Shell v0.9.9 (PHP 7.2.22 — cli) by Justin Hileman
>>> User::factory(100)->create()
Selamat Datatables sudah berhasil kita integrasi. Kamu dapat membukan http://localhost:8000/users untuk membuka Datatables Users.