当使用select case和参数绑定时,laravel paginate

时间:2017-10-17 08:53:01

标签: php laravel laravel-query-builder laravel-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);

这将得到计数,因为我们知道这将删除所有选择部分并将其替换为count(*)作为聚合,因此如果我在此查询构建器上使用setBindings并传递[' my-keyword&#39 ,' 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();

对于这种情况我知道它错了,但现在它有效!

我该怎么做才能以正确的方式解决这个问题?!

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

像这样写下原始查询:

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