Я новичок на Laravel и пытаюсь использовать Yajra Datatable Плагин с серверной функциональностью. Плагин хорошо работает с небольшим количеством записей, но у меня есть большое количество записей около 100000.
Чтобы ускорить процесс в моем контроллере, я ограничиваю результат запроса с помощью take (10) и использую другой запрос для подсчета итоговых результатов. Пока все хорошо.
Проблема в том, как управлять исследованиями. В дополнение к основной области исследований, я использовал также поиск по отдельному столбцу но я не знаю, как вернуть правильные номера записей для управления нумерацией страниц с помощью отдельного поискового фильтра.
Я думаю, что ключи поиска людей находятся в $columns = $request->get('columns');
но я не знаю, как управлять запросом графа.
Спасибо за ваш драгоценный совет.
HTML Просмотр кода:
<table id="oTable">
<thead>
<tr>
<th>Action</th>
<th>Brand</th>
<th>Code</th>
<th>Description</th>
</tr>
<tr>
<th class="no_search"></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
</table>
Код Jquery:
$('#oTable').DataTable({
dom: 'lfrtip',
"processing": true,
"serverSide": true,
"ajax": '{!! url('getRecords') !!}',
"columns": [
{data: 'items.id', name: 'items_id'},
{data: 'brands.description', name: 'brands_description'},
{data: 'items.code', name: 'items_code'},
{data: 'items.description', name: 'items_description'}
],
columnDefs: [
{targets: 'no_sort', orderable: false}
],
initComplete: function () {
this.api().columns().every(function () {
var column = this;
var columnClass = column.header().className;
if (columnClass.indexOf('no_search') != false) {
var input = document.createElement("input");
$(input).addClass('form-control');
$(input).appendTo($(column.header()).empty())
.on('change', function () {
column.search($(this).val(), false, false, true).draw();
});
}
});
}
});
Метод контроллера:
public function getRecords(Request $request) {
$search = $request->input('search.value');
$columns = $request->get('columns');
$count_total = \DB::table('items')
->join('brands', 'item.brand', '=', 'brands.code')
->count();
$count_filter = \DB::table('items')
->join('brands', 'items.brand', '=', 'brands.code')
->where( 'brands.description' , 'LIKE' , '%'.$search.'%')
->orWhere( 'items.description' , 'LIKE' , '%'.$search.'%')
->orWhere( 'items.code' , 'LIKE' , '%'.$search.'%')
->count();
$items= \DB::table('items')
->join('brands', 'items.brand', '=', 'brands.code')
->select(
'items.id as items_id',
'items.code as items_code',
'items.description as items_description',
'brands.description as brands_description'
) -> take(10);
return Datatables::of($items)
->with([
"recordsTotal" => $count_total,
"recordsFiltered" => $count_filter,
])
->rawColumns(['items_id','brands_description'])
->make(true);
}
Используйте реализацию как сервис, смотрите документацию здесь https://datatables.yajrabox.com/services/basic
Других решений пока нет …