Я пытался реализовать Datatable с Laravel, но у меня проблема, когда в моей таблице большое количество строк, потому что Datatable получает ВСЕ в одном запросе, а затем разбиение на страницы выполняется на стороне JS. Могу ли я использовать разбивку на страницы Laravel или вернуть строки с разбивкой на страницы с помощью метода paginate()
из Eloquent по методу ajax? Потому что это большая проблема для моего проекта. Загрузка данных очень медленная. Когда я ищу, обработка некоторых текстов также очень медленная, и после некоторых операций, таких как sort
, search
и т. д. Страница зависает, и ничего не происходит.
Я надеюсь, что у кого-то есть такая же проблема, как это.
serverSide: true,
processing: true,
render: true,
columns: [
{data: 'code'},
{data: 'name', "defaultContent": "<i>Not set</i>"},
{data: 'native_name', "defaultContent": "<i>Not set</i>"},
{data: 'action'}
],
ajax: '{!! route('dt-languages') !!}'
Возможно, вы используете коллекцию вместо запроса? Можете ли вы вставить свой серверный код? Спасибо!
Я использую шаблон репозитория, и в моем LanguageRepository.php у меня есть:
return $this->languages->select('languages.*')->get();
Вам нужно удалить get, чтобы использовать построитель запросов.
return $this->languages->select('languages.*');
Хорошо. Теперь выглядит лучше. Буду тестировать еще раз и отпишусь о результатах.
Но пока есть еще одна проблема. Когда я пытаюсь найти какое-то слово, я получаю эту ошибку:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'languages.action' in 'where clause' (SQL: select count(*) as aggregate from (select '1' as `row_count` from `languages` where (LOWER(`languages`.`name`) LIKE %m% count_row_table)
Установите действие как недоступное для поиска/упорядочивания, так как это добавленный столбец.
Большое спасибо! @yajra
Когда я закончу с тестированием, я отправлю вам результаты
Мои результаты тестирования:
Первый запрос:
select count(*) as aggregate from (select '1' as row_count from languages where languages.deleted_at is null and languages.deleted_at is null) count_row_table
-> 3,64 мс
Второй запрос:
select languages.* from languages where languages.deleted_at is null order by code asc limit 10 offset 0
-> 1,05 мс
Еще раз спасибо @yajra за помощь.
Рад, что смог помочь! Спасибо!
Я страдаю от проблемы. Медленный рендеринг. Мой запрос на стороне сервера.
$products = DB::connection("mysql2")->table('products')->
join('products_description', 'products.products_id', '=', 'products_description.products_id')
->select(['products.products_id', 'products_description.products_name', 'products.products_isbn13', 'products.products_distributor', 'products.products_price', 'products.products_status']);
return Datatables::of($products)->make(true);
Помоги мне. Должен ли я написать свой собственный скрипт для разбиения на страницы? Что я должен делать?
У меня есть записи о более чем 4 000 000 товаров.
@yajra очень признателен, если вы мне поможете.
Я тоже получил это, может быть, запрос с данными не связывает параметр разбиения на страницы с запросом?
@pnghai , как я могу это проверить?
@hsali Прости. Ложная сигнализация. Оказалось, что моя логика включала удаленную выборку изображения, которая ссылается на тупиковый сервер и заставляет каждую запись извлекать неправильное соединение 404, что занимает количество записей * 60 (секунд до тайм-аута). Я приостановил эту логику, и теперь все работает очень хорошо.
Спасибо большое
(p/s: ник pnghai — это еще один мой аккаунт на github)
@pnghai , как я могу это проверить?
Вы смогли это решить? Если да, то как?
Для тех, у кого медленная загрузка, у вас может быть какой-то цикл в вашей функции контроллера, который каким-то образом зацикливает извлеченные записи.
Самый полезный комментарий
Вам нужно удалить get, чтобы использовать построитель запросов.