Laravel Yajra Datatables необработанный SQL

#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