php 使用选择大小写和参数绑定时laravel分页

qmb5sa22  于 2023-01-24  发布在  PHP
关注(0)|答案(2)|浏览(153)

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)->setBindings(['my-keyword', 'my-keyword'])->paginage(10);

这将得到count,正如我们所知,这将删除所有选择部分,并将其替换为count(*)作为聚合,因此如果我在此查询构建器上使用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();

在这种情况下,我知道这是错误的,但现在它的工作!
我该怎么做才能正确地解决这个问题?!

nx7onnlm

nx7onnlm1#

你可以试试这个:
像这样编写原始查询:

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

wmomyfyw2#

绑定被归类为雄辩类,默认情况下,setBindings覆盖了where部分的所有现有绑定(只需查看方法的签名)
因此,需要将setBindings的第二个参数设置为select

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

或者,对于addBinding也是如此

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

相关问题