Search

How to Implement Yajra Datatables in Laravel 8

post-title

Datatable is jQuery plugin that provides responsive table and with rich features like automatic pagination, search, order with any column, export eo excel, csv etc. format.

yajra/laravel-datatables is a Laravel package which can imtegrate Datatable in Laravel application and render in the blade view. You can filter, customize fields from database.

yajra/datatable returns data in Json format, so you can also use yajra/datatable for api services. IN this article we will implement server side Datatable in Laravel 8. So let's get started.

1. Laravel project create

We are creating new project setup, so create new project using below command.

composer create-project --prefer-dist laravel/laravel yajra

Now go to project directory

cd yajra

2. Install and configure package

Run the below command in your project to get the latest version of the datatable package.

composer require yajra/laravel-datatables-oracle

After that you need to register package classes in providers array in config/app.php file.

'providers' => [
    ...
    Yajra\DataTables\DataTablesServiceProvider::class,
]

In the same file $aliases array, add the line.

'aliases' => [
    ...
    'DataTables' => Yajra\DataTables\Facades\DataTables::class,
]

3. Database migration

In the application environment .env file, change database details.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=yajra
DB_USERNAME=root
DB_PASSWORD=root

And run the migrate command.

php artisan migrate

4. Create dummy data

Now we need some dummy data to display. For that we will use Factory. First check your app/Models/User.php class use HasFactory trait.

Laravel already has factory class for User in /database/factories/ directory.

In the Terminal or CMD, open Laravel tinker using command.

php artisan tinker

And run the command to generate records. This will generate 100 dummy users.

User::factory()->count(100)->create();

5. Create route and Controller

Now in this step we are creating route for view in this path routes/web.php.

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

Route::get('users', [UserController::class, 'index'])->name('index');
Route::get('users/data', [UserController::class, 'data'])->name('data');

Now create controller using command:

php artisan make:controller UserController

Now open controller file at /app/Http/Controller/UserController.php file and create the above two methods.

<?php
     
namespace App\Http\Controllers;
     
use DataTables;
use App\Models\User;
use Illuminate\Http\Request;
     
class UserController extends Controller
{
    /**
     * users view
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        return view('users');
    }

    /**
     * data
     *
     * @return \Illuminate\Http\Response
     */
    public function data(Request $request)
    {
        $data = User::orderBy('id', 'desc')
            ->get();
        
        return Datatables::of($data)
                ->addIndexColumn()
                ->addColumn('action', function($row) {
                       return '<a href="javascript:void(0)" class="edit btn btn-primary btn-sm">View</a>';
                })
                ->rawColumns(['action'])
                ->make(true);
    }
}

6. Create view file

In the last step, we create blade view file at /resources/views/users.blade.php

<!DOCTYPE html>
<html>
    <head>
        <title>Laravel Datatable example</title>
        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
        <link href="//cdn.datatables.net/1.10.25/css/jquery.dataTables.min.css" rel="stylesheet">
        <link href="//cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js" rel="stylesheet">
    </head>
    <body>
        <div class="container">
            <div class="row">
                <h1 class="mb-3 text-center">Laravel Datatables Example </h1>
                <table class="table table-bordered datatable">
                    <thead>
                        <tr>
                            <th>#</th>
                            <th>Name</th>
                            <th>Email</th>
                            <th width="100px">Action</th>
                        </tr>
                    </thead>
                </table>
            </div>
        </div>
        <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
        <script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
        <script type="text/javascript">
        $(document).ready(function() {
            var table = $('.datatable').DataTable({
                processing: true,
                serverSide: true,
                ajax: "{{ route('data') }}",
                columns: [
                    {data: 'DT_RowIndex', name: 'DT_RowIndex'},
                    {data: 'name', name: 'name'},
                    {data: 'email', name: 'email'},
                    {data: 'action', name: 'action', orderable: false, searchable: false},
                ]
            });
        });
        </script>
    </body>
</html>

Now everything is completed. Start the Laravel server using artisan command.

php artisan serve

In your web browser go to http://localhost:8000/users

I hope it will help you.