0

i try to use yajra datatables laravel i have problem in searching when i search data already exits in datatables it no working me already try example in documentation but it not working for me

can someone please help me? teach me how to do like i mean

example data example searching

** this is my javascript datatables**

let oTable = $("#example1").DataTable({
        responsive: true,
        autoWidth: false,
        processing: true,
        serverSide: true,
        ajax:
        {
            url: '{{ route("data.user.datatables") }}',
            type: 'GET',
            data: function (d) {
                d.filter = $('select[name=filter]').val();
            }
        },
        columns: [
            { data: 'id'},
            { data: function(data, type, row){
                return 'Username : ' + data.username +
                '<br> Email : ' + data.email +
                '<br> Ponsel : ' + data.contact_number;
            },
            name: 'username'
            },
            {
            data: function(data, type, row){
                return 'Register Date : ' +  data.created_at +
                        '<br> Last Login : ' + data.last_login +
                        '<br> App By : '+ data.app_admin +' / '+ data.date_admin_app +
                        '<br> App By : '+ data.login +' || '+ data.status_member;
            },

             name: 'created_at'
            },
            { data: function(data, type, row){
                return 'Saldo : ' +  data.saldo +
                    '<br> Bank Name : ' + data.bank_name +
                    '<br> Account Name : '+ data.account_name +
                    '<br> Account Number : '+ data.account_number;
            },
            name:'saldo'
            },
            { data: 'action', orderable: false, searchable: false}
        ],
        order:[[0,'desc']],

    });

this in my Laravel CONTROLLER

if($request->ajax()):

            $request->validate([
                'filter' => ['string','nullable','alpha'],
            ]);

            if($request->filled('filter')):
                $users = User::query()->where('status_member', $request->filter);
            else:
                $users = User::query();
            endif;
            $data =  Datatables::of($users);
             $data->addIndexColumn();
             $data->addColumn('action', function ($user) {
                return '<div class="btn-group" role="group" aria-label="Button group with nested dropdown">
                            <div class="btn-group" role="group">
                                <button id="btnGroupDrop1" type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Action</button>
                                <div class="dropdown-menu" aria-labelledby="btnGroupDrop1">
                                    <a class="dropdown-item modal-edit-user" data-toggle="modal" data-target="#modalEditUser" href="javascript:void(0)" data-id="' . $user->id . '" data-username="' . $user->username . '" >Edit</a>
                                    <a class="dropdown-item" href="#">Dropdown link</a>
                                </div>
                            </div>
                        </div>';
            });
            $data->rawColumns(['action']);
            return $data->make();
        endif;
Karl Hill
  • 12,937
  • 5
  • 58
  • 95
CaptanJunior
  • 1
  • 1
  • 5

2 Answers2

1

You are forwarding nothing at all to user query.

Instead of

$users = User::query()->where('status_member', $request->filter);
...
$users = User::query();

try doing

$users = User::where('status_member', $request->filter)->get();
...
$users = User::all();

EDIT:

update your code:

{ data: 'action', orderable: false, searchable: false}

to

{ data: 'action', orderable: false, searchable: true}
Norgul
  • 4,613
  • 13
  • 61
  • 144
0

You can extract the level filter on the query level to make this work like this:

  1. Draw the table again on the Dropdown Change

    let oTable = $("#example1").DataTable({
    responsive: true,
    autoWidth: false,
    processing: true,
    serverSide: true,
    ajax:
    {
        url: '{{ route("data.user.datatables") }}',
        type: 'GET',
        data: function (d) {
            d.filter = $('select[name=filter]').val();
        }
    },
    columns: [
        { data: 'id'},
        { data: function(data, type, row){
            return 'Username : ' + data.username +
            '<br> Email : ' + data.email +
            '<br> Ponsel : ' + data.contact_number;
        },
        name: 'username'
        },
        {
        data: function(data, type, row){
            return 'Register Date : ' +  data.created_at +
                    '<br> Last Login : ' + data.last_login +
                    '<br> App By : '+ data.app_admin +' / '+ data.date_admin_app +
                    '<br> App By : '+ data.login +' || '+ data.status_member;
        },
    
         name: 'created_at'
        },
        { data: function(data, type, row){
            return 'Saldo : ' +  data.saldo +
                '<br> Bank Name : ' + data.bank_name +
                '<br> Account Name : '+ data.account_name +
                '<br> Account Number : '+ data.account_number;
        },
        name:'saldo'
        },
        { data: 'action', orderable: false, searchable: false}
    ],
    order:[[0,'desc']],
    
    });
    
    //Add these lines here
    $('select[name=filter]').change(function(){
    oTable.draw();
    });
    
  2. Filter the result by query

    if($request->ajax()):
    
        $request->validate([
            'filter' => ['string','nullable','alpha'],
        ]);
        $filter = $request->filter;
    
        $users = User::select('*')
        ->when($filter, function($query) use ($filter) { 
            return $query->where('status_member', '=', $filter);
          })
        ->get();
    
    
        $data =  Datatables::of($users);
         $data->addIndexColumn();
         $data->addColumn('action', function ($user) {
            return '<div class="btn-group" role="group" aria-label="Button group with nested dropdown">
                        <div class="btn-group" role="group">
                            <button id="btnGroupDrop1" type="button" class="btn btn-success dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Action</button>
                            <div class="dropdown-menu" aria-labelledby="btnGroupDrop1">
                                <a class="dropdown-item modal-edit-user" data-toggle="modal" data-target="#modalEditUser" href="javascript:void(0)" data-id="' . $user->id . '" data-username="' . $user->username . '" >Edit</a>
                                <a class="dropdown-item" href="#">Dropdown link</a>
                            </div>
                        </div>
                    </div>';
        });
        $data->rawColumns(['action']);
        return $data->make();
    endif;