Фильтр пользовательского поиска - Yajra Datatables Service

Я работаю над таблицами данных яджры. Мы используем его как услугу, мне интересно, можно ли сделать для него поиск с помощью настраиваемого фильтра? Есть ссылки или предложения?

Вот мой код:

public function dataTable($query)
{
    $datatables = datatables()->eloquent($query);
    return $datatables;
}

public function query()
{
    $report= AdminReport::select();

    return $this->applyScopes($report);
}

public function html()
{
    return $this->builder()
                ->setTableId('admin-reports-table')
                ->columns($this->getColumns())
                ->minifiedAjax()
                ->dom('Bflrtip')
                ->orderBy(0);
}

protected function getColumns()
{
    return [
        'id' => ['title' => 'ID #'],
        'player_name' => ['title' => 'Player Name'],
        'balance' => ['title' => 'Current Balance'],
    ];
}

Вот мой интерфейс: index.blade.php

<div class="col-sm-12">
  <div class="card">
    <div class="card-body">
      <div class="panel-body">
        <form class="form-inline" method="post" autocomplete="off" action=" 
          {{url('admin_report/filter') }}">
          <div class="form-group mx-sm-3 mb-2">
            <input type="date" class="form-control" name="date_range" placeholder="Date Range">
          </div>
          <button type="submit" class="btn btn-primary mb-2">Query</button>
        </form>                  
      </div>                            
     </div>
    </div>
</div>
<!-- DATATABLE -->
<div class="content">
   <div class="container-fluid">
       {{$dataTable->table(['class'=>'table table-bordered table-hover'])}}
   </div>
</div>

@push('scripts')
    {{$dataTable->scripts()}}
@endpush

Я просто хочу спросить, как я могу реализовать настраиваемый фильтр поиска для этого подхода.

Заранее спасибо, ребята.


person Tallgeese    schedule 27.02.2020    source источник
comment
Что вы имеете в виду под пользовательским фильтром поиска? Чего ты хочешь добиться?   -  person user8555937    schedule 27.02.2020
comment
Возможно, они вам помогут: datatables.yajrabox.com | yajrabox.com/docs/laravel-datatables/master/engine-eloquent   -  person user8555937    schedule 27.02.2020
comment
@ user8555937, мне нужен тип ввода, в котором пользователь может поместить то, что он хочет найти, в таблицу, а затем отправить его.   -  person Tallgeese    schedule 27.02.2020


Ответы (2)


Сейчас я работаю над подобным случаем, это то, что у меня есть в коде, и он работает на 100%. В моем случае я фильтрую свои результаты на основе входных данных диапазона дат. Я выделил только важные части, используйте их вместе с документами Yajra и DataTable.net. Я также использую шаблон администратора Keentheme Metronic, он поддерживается и хорошо документирован.

приложение / DataTable NameXclass.php

public function dataTable($query, Request $request)
{
    return datatables()
        ->eloquent($query)
        ->filterColumn('created_at', function ($query, $keywords) use ($request) {
            if (!$request->has('joined_between')) {
                return; //ignore if there are no dates
            }
            switch (sizeof($request->joined_between)){
                case 1: //do this if only 1 date is provided
                    $start = new Carbon($request->joined_between[0]);
                    $query->whereDate('created_at','=', $start);
                    break;
                case 2: //do this if both dates are provided
                    if($request->joined_between[0] == $request->joined_between[1]){
                        $start = new Carbon($request->joined_between[0]);
                        $query->whereDate('created_at','=', $start);
                    }else{
                        $query->whereBetween('created_at', $request->joined_between);
                    }
                    break;
            }
        });
}

index.blade.php

Здесь необходимо отметить несколько важных моментов: datatable-input - это класс css, который я использую для ссылки на входы в js, атрибуты name используются в php для получения значений из запроса (см. Код выше, я передал объект $ request), а атрибут data-col-index требуется yajra datatable для сопоставления фильтров с правильным столбцом. Я совершил ошибку, не включив / не сопоставив их правильно, и неделю пытался понять, что я делаю не так. Так что имейте в виду и не походите на меня

<div class="input-daterange input-group" id="kt_datepicker">
   <input type="text" class="form-control datatable-input" name="start" placeholder="From" data-col-index="2" />
   <input type="text" class="form-control datatable-input" name="end" placeholder="To" data-col-index="2" />
</div>

.js

//columns .. data-col-index=2 maps to created_at
var columns = [
    {data: 'id', name: 'id'},
    {data: 'appointmentable_type', name: 'appointmentable_type'},
    {data: 'created_at', name: 'created_at'},
    {data: 'updated_at', name: 'updated_at'},
]
...
//The search button event listener
$('#search').on('click', function(e) {
    e.preventDefault();
    var params = {};
    $('.datatable-input').each(function() {
        var i = $(this).data('col-index');
        if (params[i]) {
            params[i] += '|' + $(this).val();
        }
        else {
            params[i] = $(this).val();
        }
    });
    $.each(params, function(i, val) {
        // apply search params to datatable
        table.column(i).search(val ? val : '', false, false);
    });
    table.table().draw();
});
person Sibongiseni Msomi    schedule 07.08.2020
comment
Ах да ... Я забыл включить этот фрагмент, который необходимо передать объекту инициализации .DataTable ({}) в вашем файле .js. Я использую его для отправки дат `ajax: {data: function (d) {let range = []; range.push (moment ($ ('input [name = start]'). val ()). format ('ГГГГ-ММ-ДД ЧЧ: мм: сс')): ''; range.push (moment (input [name = end] '). val () +' 23:59:59 '). format (' YYYY-MM-DD HH: mm: ss ')):' '; d.joined_between = диапазон; }} ` - person Sibongiseni Msomi; 07.08.2020

Согласно официальным документам, вы можете использовать filterColumn для реализации настраиваемого поиск по определенному столбцу.

ИЛИ вы можете использовать ручной поиск, чтобы написать свои собственные функции ручной фильтрации и таким образом отключив глобальный поиск пакета.

Вы также можете проверить аналогичную проблему на github.

person Amir Hossein    schedule 13.03.2021