Поиск данных со значениями отношений - PullRequest
0 голосов
/ 29 января 2020

У меня проблема, когда мне нужно выполнить поиск по моим данным. У меня есть 4 столбца по отношению к другим таблицам. На моем контроллере я выполняю объединение для преобразования этих данных, поэтому, когда я помещаю некоторый идентификатор в поле поиска, фильтр работает хорошо, но мне нужно, чтобы этот поиск работал только с данными, представленными на экране.

Вот мой контроллер:

public function revList(Request $request)
{
    if(auth()->user()->can('Visualizar Revisão')){
        $revisoes = DB::table('revisao_ambientes')
            ->join('unidades', 'revisao_ambientes.unidade_id', '=', 'unidades.id')
            ->join('blocos', 'revisao_ambientes.bloco_id', '=', 'blocos.id')
            ->join('ambientes', 'revisao_ambientes.ambiente_id', '=', 'ambientes.id')
            ->join('users', 'revisao_ambientes.user_id', '=', 'users.id')
            ->select([
                'revisao_ambientes.unidade_id', 'unidades.name as unidade_name', 
                'revisao_ambientes.bloco_id', 'blocos.name as bloco_name', 
                DB::raw('CONCAT(ambientes.sala, " - ", ambientes.name) as ambiente_name'),
                'revisao_ambientes.user_id', 'users.name as user_name', 
                'revisao_ambientes.created_at as created_at',
                'revisao_ambientes.rev_id as rev_id',
            ]);                 

        return datatables()->of($revisoes) 
            ->addColumn('detalhes', function($row) {
                return '<a href="revisao/'. $row->rev_id .'" class="label label-info">Detalhes</a>';
            })
            //Try to make a filter by the building (Don't work)
            ->filterColumn('bloco_name', function($revisoes, $search) {
                $revisoes->where('blocos', 'LIKE', "{$search}%");
            })
            ->rawColumns(['detalhes'])
            ->make(true);
        }else{
            return view('errors.401');
        } 
    }

А вот мой сценарий с данными на стороне сервера:

$(document).ready( function () {
$('#rev-datatable').DataTable({                 
  dom: 'Blfrtip',
      lengthMenu: [
          [10, 25, 50, 100, -1], 
          [10, 25, 50, 100, "Todos"]
        ],
      buttons: [
          { extend: 'copy', text: 'Copiar', exportOptions: {
                columns: [ 0, 1, 2, 3, 4 ]
            }},
          { extend: 'excel', text: 'Excel', exportOptions: {
                columns: [ 0, 1, 2, 3, 4]
            }},
          { extend: 'pdf', text: 'PDF', orientation: 'landscape',
            pageSize: 'LEGAL', exportOptions: {
                columns: [ 0, 1, 2, 3, 4]
            }},             
      ],
      processing: true,
      Filter: true,
      lengthChange: true,
      lengthMenu: [[10, 25, 50, 100, 200, -1], [10, 25, 50, 100, 200, "Todos"]],
      order:[[0,'desc']],
      serverSide: true,
      ajax: "{{ url('/revisao/rev-list') }}",
      columns: [
          { data: 'created_at', name: 'created_at' },
          { data: 'user_name', name: 'user_id' },
          { data: 'unidade_name', name: 'unidade_id' },
          { data: 'bloco_name', name: 'bloco_id' },
          { data: 'ambiente_name', name: 'ambiente_id' }, 
          { data: 'detalhes', searchable: false, orderable: false},                 
             ] , 
    });
 });

Что мне нужно сделать, чтобы это работало?

спасибо заранее!

1 Ответ

0 голосов
/ 29 января 2020

Я не до конца понимаю вопрос, но вижу проблему с опцией datatables для ваших столбцов. Свойство name определяет имя столбца в базе данных, поэтому измените столбцы на это:

    columns: [
      { data: 'created_at', name: 'revisao_ambientes.created_at' },
      { data: 'user_name', name: 'users.name' },
      { data: 'unidade_name', name: 'unidades.name' },
      { data: 'bloco_name', name: 'blocos.name' },
      { data: 'ambiente_name' }, 
      { data: 'detalhes', searchable: false, orderable: false},                 
    ] ,

Также вам не нужно определять filterColumn для bloco_name, но вам нужно его для ambiente_name. Вот почему я удалил имя для ambiente_name в столбцах. Теперь удалите filterColumn для bloco_name и добавьте следующее:

->filterColumn('ambiente_name', function($revisoes, $search) {
    $sql = "CONCAT(ambientes.sala, ' - ', ambientes.name) like ?";
    $revisoes->whereRaw($sql, ["%{$search}%"]);
})

Поскольку мы внедряем поиск $ с помощью привязки параметров, нет риска внедрения SQL. Также обратите внимание, что, упоминая фактическое имя столбца базы данных, вы даете информацию о своей внутренней структуре базы данных, что считается недостатком безопасности. Если вам все равно, то это решение, но если вам нужно, напишите filterColumn для каждого столбца и удалите все свойства «name» из столбцов datatables.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...