Different () с нумерацией страниц () в Laravel 5.2 не работает

Я пытаюсь использовать distinct() с pagination() в Ларавелла 5.2 с беглым, и это дает правильный результат, но нумерация страниц остается тем же (как и без применения отчетливо).

Я уже рассмотрел и проверил ниже ответы с моим кодом
laravel 5 — paginate total () запроса с отчетливым
нумеровать страницы & отчетливый
Неверный номер метода разбивки на страницы в 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) так что я применяю distinct(),
— Теперь мой результат POST1, POST2 а также POST3 но нумерация страниц по-прежнему отображается как 4 записи (как результат до применения distinct()).

Любое предложение будет оценено!

5

Решение

Похоже, что у Laravel есть некоторые проблемы с использованием нумерации страниц.

В этом случае, когда нумерация страниц определяет общее количество записей, она игнорирует поля, указанные в вашем select() пункт. Так как он игнорирует ваши столбцы, отдельные функции также игнорируются. Таким образом, запрос количества становится select count(*) as aggregate from ...

Чтобы решить эту проблему, вам нужно сообщить функции paginate о ваших столбцах. Передайте ваш массив столбцов, чтобы выбрать в качестве второго параметра, и он будет учитывать их для общего количества. Итак, если вы делаете:

/*DB::stuff*/->paginate(5, ['T1.*']);

Это запустит запрос подсчета:

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.*']);
4

Другие решения

Отличное работает …. Когда вы делаете объединение, он проверяет для различных записей во всех выбранных столбцах и здесь … имена столбцов, которые вы получаете после объединения, также включаются в объединение …

Чтобы запустить это, пожалуйста, добавьте select() к вашему экземпляру строителя и он должен работать 🙂

DB::table('myTable1 AS T1')
->join('myTable2 AS T2','T2.T1_id','=','T1.id')
->select('T1.*')
->distinct()
->paginate(5);

Дайте мне знать, если это не сработает для вас 🙂

0

Я нашел проблему в своем коде, то есть мне нужно пройти $column в качестве второго параметра в paginate($perPage, $columns, $pageName, $page), Я получил решение от Laravel Git Issue.

Итак, мой рабочий код:

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,
]);
}
0
По вопросам рекламы [email protected]