Laravel Версия: 5.5
Версия PHP: 7
Привет, я хочу выполнить этот запрос:
select (case
when(title like 'my-keyword') then 1
when(description like 'my-keyword') then 2
) as ordering from products where id > 10;
Когда я делаю это с помощью построителя запросов:
$products = DB::table('products')->select(DB::raw('(case
when(title like '?') then 1
when(description like '?') then 2
) as ordering'))->where('id', '>', 10)->setBinding(['my-keyword', 'my-keyword'])->paginage(10);
он получит счетчик, и, как мы знаем, он удалит все выбранные детали и заменит их на счетчик (*) в качестве агрегата, поэтому, если я использую setBindings для этого построителя запросов и передам [‘my-keyword’, ‘my-keyword’] на этот запрос для агрегата изменится на это:
select count(*) as aggregate from products where id > my-keyword;
Так что это вызовет проблему использования нумерации страниц в этом запросе и других альтернативах, таких как этот запрос!
Чтобы решить эту проблему, я изменил некоторые коды в /…./Query/Builder.php этот:
$total = $this->getCountForPagination($columns);
к этому:
$all = $this->get();
$total = $all->count();
для этой ситуации я знаю, что это неправильно, но пока это работает!
Что я должен сделать, чтобы решить эту проблему правильно ?!
Вы можете попробовать это:
Напишите вам сырой запрос, как это:
DB::select('RAW_QUERY');
Это вернуло бы массив. Вы можете использовать LengthAwarePaginator для разбивки на массивы следующим образом:
use Illuminate\Pagination\LengthAwarePaginator;$this->paginateArray($array, $perPage);
public function paginateArray($items, $perPage)
{
$pageStart = \Request::get('page', 1);
$offSet = ($pageStart * $perPage) - $perPage;
$itemsForCurrentPage = array_slice($items, $offSet, $perPage, true);
return new LengthAwarePaginator($itemsForCurrentPage, count($items), $perPage, Paginator::resolveCurrentPage(), array('path' => Paginator::resolveCurrentPath()));
}
Других решений пока нет …