Laravel 8 Datatables Filter with Dropdown

Laravel 8 Datatables Filter with Dropdown

Hello friends, Today we will show Laravel 8 Datatables Filter with Dropdown Tutorial. In this example we will explain hoe to use laravel 8 datatables custom filter with dropdown. Here we will add datatables custom filter using field and searching data without refresh datatable.

In this post we will share with you example of laravel 8 datatables dropdown filter. You just required to some step to done laravel 8 yajra datatable dropdown filter with laravel.

After read this post you can easily add dropdown filter with yajra datatables in laravel 6, laravel 7 and laravel 8. So let’s following  step by step to integrate yajra datatable dropdown filter with laravel.

Laravel 8 Datatables Filter with Dropdown Example

Step 1 : Install Laravel for laravel 8 datatables filter with dropdown tutorial

In this step we need to install new laravel application for Laravel Datatables Filter with Dropdown.

composer create-project --prefer-dist laravel/laravel datatable-example
Step 2 : Integrate Yajra Datatable for Dropdown Filter 

In this step we will install Yajra datatable in laravel 8 application for dropdown filter.

composer require yajra/laravel-datatables-oracle

config/app.php.

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

Step 3 : Add New Column in Users Table for filter column

After that we will add new column using migration

php artisan make:migration add_approved_column

database/migrations/2021_16_09_043348_add_approved_column.php

<?php
  
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
  
class AddApprovedColumn extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->boolean('approved')->default(0);
        });
    }
    public function down()
    {
         
    }
}

Run this migration.

php artisan migrate

Step 4 : Add Record using Tinker

In this step we need to add dummy data for user table.

php artisan tinker 
factory(App\User::class, 50)->create();

Step 5 : Add Route

Route::get('users', ['uses'=>'UserController@index', 'as'=>'users.index']);

Step 6 : Create Controller

<?php
       
namespace App\Http\Controllers;
      
use App\User;
use Illuminate\Http\Request;
use DataTables;
      
class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {
        if ($request->ajax()) {
            $data = User::select('*');
            return Datatables::of($data)
                    ->addIndexColumn()
                    ->addColumn('approved', function($row){
                         if($row->approved){
                            return '<span class="badge badge-primary">Yes</span>';
                         }else{
                            return '<span class="badge badge-danger">No</span>';
                         }
                    })
                    ->filter(function ($instance) use ($request) {
                        if ($request->get('approved') == '0' || $request->get('approved') == '1') {
                            $instance->where('approved', $request->get('approved'));
                        }
                        if (!empty($request->get('search'))) {
                             $instance->where(function($w) use($request){
                                $search = $request->get('search');
                                $w->orWhere('name', 'LIKE', "%$search%")
                                ->orWhere('email', 'LIKE', "%$search%");
                            });
                        }
                    })
                    ->rawColumns(['approved'])
                    ->make(true);
        }
        
        return view('users');
    }
}

Step 7 : Create BLade file for View

<html>
<head>
    <title>Laravel 8 Datatables Filter with Dropdown - web-tuts.com</title>
    <meta name="csrf-token" content="{{ csrf_token() }}">
    
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" />
    <link href="https://cdn.datatables.net/1.10.25/css/dataTables.bootstrap5.min.css" rel="stylesheet">
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>  
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.0/jquery.validate.js"></script>
    <script src="https://cdn.datatables.net/1.10.25/js/jquery.dataTables.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>
    <script src="https://cdn.datatables.net/1.10.25/js/dataTables.bootstrap5.min.js"></script>

</head>
<body>
     
<div class="container">
    <h1>Laravel 8 Datatables Filter with Dropdown - web-tuts.com</h1>
      
    <div class="card">
        <div class="card-body">
            <div class="form-group">
                <label><strong>Approved :</strong></label>
                <select id='approved' class="form-control" style="width: 200px">
                    <option value="">Approved</option>
                    <option value="1">Yes</option>
                    <option value="0">No</option>
                </select>
            </div>
        </div>
    </div>
  
    <table class="table table-bordered data-table">
        <thead>
            <tr>
                <th>No</th>
                <th>Name</th>
                <th>Email</th>
                <th width="100px">Approved</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
</div>
     
</body>
     
<script type="text/javascript">
  $(function () {
      
    var table = $('.data-table').DataTable({
        processing: true,
        serverSide: true,
        ajax: {
          url: "{{ route('users.index') }}",
          data: function (d) {
                d.approved = $('#approved').val(),
                d.search = $('input[type="search"]').val()
            }
        },
        columns: [
            {data: 'id', name: 'id'},
            {data: 'name', name: 'name'},
            {data: 'email', name: 'email'},
            {data: 'approved', name: 'approved'},
        ]
    });
  
    $('#approved').change(function(){
        table.draw();
    });
      
  });
</script>
</html>

I hope you understand of Laravel Datatables Filter with Dropdown and it can help you…