Проблема с запросом количества страниц (*)

  • Версия Laravel: 8.0
  • Версия PHP: 7.3.0
  • Драйвер базы данных и версия: MySQL 5.7.34

Опишите ошибку

Когда я использую paginate для разбивки на страницы, данные вызывают запрос count(*) каждый раз, даже когда я передаю имя столбца, например count(['id']), и запрос count(*) сканирует всю строку в таблице.

  • Имя таблицы users и 45 столбцов.

  • Маршрут

Route::get("users", "UsersController@index");

  • Контроллер
namespace App\Http\Controllers\Api\V1;

class UsersController extends Controller
{
    public function index()
    {
        return User::paginate(10 , ['id']);
    }
 }
  • Звоните users маршрут
  • Телескоп показывает мне, что два запроса

Фактический результат

Ожидаемый результат

Шаги к решению:

  • На следующем изображении показано, что я внес изменения в соответствии с нашей функциональностью. Он возьмет имя первого столбца из переданного в массиве методов paginate параметров $columns, и этот запрос не сканирует все столбцы пользовательских таблиц.

Окончательные результаты:

Я устал решать эту проблему любым другим способом или идеей, пожалуйста, дайте мне знать

вы используете ( App\Models\User; ) ?! что такое [идентификатор]?

Hossein Azad 24.01.2023 08:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
1
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не рекомендуется когда-либо прикасаться к файлам поставщиков, вы всегда можете просто переопределить функциональность внутри своей модели, вы также можете передать столбцы, чтобы переопределить getCountForPagination(), и вы также можете передать столбцы simplePaginate(), который не вызывает никакого подсчета!

Чтобы оптимизировать запрос для подсчета и разбивки на страницы, вы можете сделать это следующим образом:

//We will call the query on the model
$program = Program::query()->getQuery();

//count the query by specific columns
$thePaginationCount = $program->getCountForPagination(['id']);

//paginate the results using simplePaginate and select the columns we want:
$thePaginatedProgram = $program->simplePaginate(10, ['id', 'name']);

return 'test: '.$thePaginatedProgram;

Получится так:

select count(`id`) as aggregate from `programs`
select `id`, `name` from `programs` limit 11 offset 0

Как видите, он загружает только то, что мы указываем, и это очень эффективно!


Последнее примечание:

Если вы просто хотите листать страницы без подсчета, вы всегда можете вызвать Model::simplePaginate($amount, [$columns...])

https://laravel.com/docs/9.x/pagination#simple-pagination

Любые идеи по использованию метода paginate(), потому что метод paginate также поддерживается для получения значения $column, в этом методе paginate мы должны передать значение столбца, а затем сделать поддержку первого параметра $column как count($column [0]) мы можем решить это методом paginate laravel.com/docs/9.x/…

Nikunj Gadhiya 24.01.2023 09:56

что вы имеете в виду, вы уже можете получить доступ к таким моделям foreach($theprogram as $item){ dd($item); }

RG Servers 24.01.2023 10:03

@NikunjGadhiya, если ваша проблема решена, пожалуйста, отметьте ответ как полный (с помощью галочки) :)

RG Servers 24.01.2023 18:04

Другие вопросы по теме