#laravel #datatable #yajra-datatable
#laravel #datatable #yajra-datatable
Вопрос:
Используя Yajra Datables, Laravel возвращает сообщение об ошибке «Память исчерпана …». На самом деле, как мы применяем фильтрацию и сортировку непосредственно к SQL вместо того, чтобы позволять стороне сервера обрабатывать фильтрацию и сортировку.
Контроллер Laravel
// Table1 has 200,000 rows, the query itself is also slow
$rs = DB::select("select *
from Table1");
$numrow = count($rs);
if ($numrow > 0) {
foreach ($rs as $row) {
$column1 = $row_customers->column1;
$arr['col1'] = $column1;
$arrs[] = $arr;
}
}
$response = Datatables::of($arrs)->make(true)->getData(true);
return response()->json($response);
Представление Laravel
$('#Table1').DataTable({
processing: true,
serverSide: true,
responsive: true,
cache: false,
ajax: {
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
},
"url": "/GetTable1",
"type": "POST",
error: function(jqXHR, ajaxOptions, thrownError) {
console.log('error.jqXHR', jqXHR);
console.log('error.ajaxOptions', ajaxOptions);
console.log('error.thrownError', thrownError);
}
}
/* ... */
});
Комментарии:
1. Лучший подход — использовать разбивку на страницы, не запрашивать все строки, вместо этого отображать записи по частям, например, при отложенной загрузке или что-то в этом роде
Ответ №1:
Вместо использования Datatables::of()
попробуйте Datatables::eloquent()
вместо этого, это может ускорить ваш запрос, особенно во время сортировки и фильтрации, поскольку он фактически включает его в инструкцию SQL во время запроса вместо фильтрации после получения всех результатов.
Вы можете подробнее ознакомиться сhttps://yajrabox.com/docs/laravel-datatables/master/engine-eloquent#facade