Как выполнить поиск по определенному столбцу с помощью таблиц данных Yajra Laravel

#laravel #datatables

Вопрос:

У меня есть пользовательский фильтр, который я хочу использовать для поиска роли пользователя. Роль возвращена правильно и доступна для поиска с использованием моего существующего кода. Однако, если поисковый запрос даже частично совпадает с чем-то другим в любой строке, ajax даже покажет другие, не относящиеся к делу строки.

Что мне нужно, так это сделать запрос, специфичный для одного столбца.

Это запрос, который я использую для запуска поиска из выпадающего меню:

 $("#users-list-role").on("change", function () {
    var usersRoleSelect = $("#users-list-role").val();       
    usersTable.columns(1).search(usersRoleSelect).draw();
  });
 

Это и есть база данных:

 var usersTable = $('#users_list_table').DataTable({
    columnDefs: [
        {
            targets: [0,1,2],
            className: 'center'
        }
    ],
    responsive: true,
    processing: true,
    serverSide: true,                    
    ajax: {
        url: formedURL,                              
    },
    columns: [
        {data: 'full_name', name: 'full_name'}, 
        {data: 'roles', name: 'roles.name'},
        {data: 'email', name: 'email'}, 
        {data: 'first_name', name: 'first_name', searchable: true, visible: false },
        {data: 'middle_name', name: 'middle_name', searchable: true, visible: false },
        {data: 'last_name', name: 'last_name', searchable: true, visible: false },          
    ],
    language: {
        "url": langURL
    },    
    initComplete:function( settings, json){
        $("#employeeTableCard").addClass("scale-in");       
    }
 

И это вызов Ajax в контроллере:

 public function listUsersData(Request $request)
{
    if(!$request->ajax())
        return Redirect::route('/');

    $users = User::with('roles'); 
   
    return DataTables::of($users)            
        ->addColumn('full_name', '{!!$first_name!!} {!!$middle_name!!} {!!$last_name!!}')
        ->addColumn('roles', function($users){ return $users->getRoleNames()->first(); })                       
        ->make(true);
}
 

Ответ №1:

Что ж, еще раз: это было простое решение.

Все, что мне было нужно, это добавить

 ->select('users.*');
 

Для

 $users = User::with('roles')
 

Это решило проблему поиска отношений, и это даже задокументировано:

 $users = User::with('roles')->select('users.*');