Я пытаюсь использовать clear pagination()
с pagination pagination()
в laravel 5.2 с беглостью, и это дает результат правильно, но разбиение на страницы остается таким же (как без применения отдельных).
Я уже рассмотрел и протестировал ниже ответы с моим кодом
– laravel 5 – paginate total () запроса с четкими
– Paginate & Distinct
– Недопустимое число счетчиков меток запроса Query Builder при использовании отдельных
Мой код выглядит примерно так:
DB::table('myTable1 AS T1') ->select('T1.*') ->join('myTable2 AS T2','T2.T1_id','=','T1.id') ->distinct() ->paginate(5);
ПРИМЕР
– У меня есть результат с тремя записями (т.е. POST1, POST2, POST3 и POST1 ), поэтому я применяю clear distinct()
.
– Теперь мои результаты – POST1, POST2 и POST3, но разбиение на страницы по-прежнему отображается как 4 записи (как результат перед применением distinct()
).
Любое предложение будет оценено!
Кажется, что некоторые проблемы с Laravel существуют и используются с разбивкой по страницам.
В этом случае, когда разбиение на страницы определяет общее количество записей, оно игнорирует поля, указанные вами в предложении select()
. Поскольку он игнорирует ваши столбцы, отдельные функции также игнорируются. Таким образом, запрос count становится select count(*) as aggregate from ...
Чтобы решить эту проблему, вам нужно сообщить функции paginate о ваших столбцах. Передайте свой массив столбцов, чтобы выбрать в качестве второго параметра, и он будет учитывать их для общего количества. Итак, если вы это сделаете:
/*DB::stuff*/->paginate(5, ['T1.*']);
Это запустит запрос count:
select count(distinct T1.*) as aggregate from
Итак, ваш запрос должен выглядеть так:
DB::table('myTable1 AS T1') ->select('T1.*') ->join('myTable2 AS T2','T2.T1_id','=','T1.id') ->distinct() ->paginate(5, ['T1.*']);
Яркий работает … Когда вы делаете соединение, он проверяет отдельные записи во всех выбранных столбцах и здесь .. Имена столбцов, которые вы получаете после присоединения, также включаются в соединение …
Чтобы запустить это, добавьте select()
в экземпляр вашего строителя, и он должен работать 🙂
DB::table('myTable1 AS T1') ->join('myTable2 AS T2','T2.T1_id','=','T1.id') ->select('T1.*') ->distinct() ->paginate(5);
Дайте мне знать, если это не сработает для вас 🙂
Я нашел проблему в своем коде, то есть мне нужно передать $column
качестве второго параметра в paginate($perPage, $columns, $pageName, $page)
. Я получил решение от laravel git .
Поэтому мой рабочий код:
DB::table('myTable1 AS T1') ->select('T1.*') ->join('myTable2 AS T2','T2.T1_id','=','T1.id') ->distinct() ->paginate(5, ['T1.*']);
Необходимое предложение
Что если, я взломаю код для Builder.php, чтобы обойти передачу второго параметра $column
. Я имею в виду, что это хорошая вещь или любой вариант теста?
/** * Paginate the given query into a simple paginator. * * @param int $perPage * @param array $columns * @param string $pageName * @param int|null $page * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator */ public function paginate($perPage = 15, $columns = null, $pageName = 'page', $page = null) { //To solved paginator issue with distinct... if(is_null($columns) && strpos($this->toSql(), 'distinct') !== FALSE){ $columns = $this->columns; $columns = array_filter($columns, function($value) { return (is_string($value) && !empty($value)); }); } else { //If null $column, set with default one if(is_null($columns)){ $columns = ['*']; } } $page = $page ?: Paginator::resolveCurrentPage($pageName); $total = $this->getCountForPagination($columns); $results = $total ? $this->forPage($page, $perPage)->get($columns) : []; return new LengthAwarePaginator($results, $total, $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'pageName' => $pageName, ]); }