lagvel paginate при использовании выбора регистра и привязки параметра

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();

для этой ситуации я знаю, что это неправильно, но пока это работает!

Что я должен сделать, чтобы решить эту проблему правильно?!

2 ответа

Привязки подразделяются на красноречивые и переопределяют все существующие привязкиwhereчасть по умолчанию (просто взгляните на сигнатуру метода)

Таким образом, вам нужно установить второй параметрsetBindingsкselect

      ->setBindings(['my-keyword','my-keyword'], 'select')

Альтернативно, это то же самое дляaddBinding

      ->addBinding('my-keyword', 'select')

Вы можете попробовать это:

Напишите свой сырой запрос, как это:

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()));
}
Другие вопросы по тегам