Я пытаюсь использовать 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()
).
Любое предложение будет оценено!
Похоже, что у 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.*']);
Отличное работает …. Когда вы делаете объединение, он проверяет для различных записей во всех выбранных столбцах и здесь … имена столбцов, которые вы получаете после объединения, также включаются в объединение …
Чтобы запустить это, пожалуйста, добавьте 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 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,
]);
}