Roh*_*aei 5 php laravel laravel-pagination laravel-query-builder
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;
Run Code Online (Sandbox Code Playgroud)
当我通过查询生成器执行此操作时:
$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);
Run Code Online (Sandbox Code Playgroud)
这将获得计数,正如我们所知,这将删除所有选择部分并将其替换为 count(*) 作为聚合,因此如果我在此查询生成器上使用 setBindings 并传递 ['my-keyword', 'my-keyword']此聚合查询将更改为:
select count(*) as aggregate from products where id > my-keyword;
Run Code Online (Sandbox Code Playgroud)
因此,这将导致在此查询和其他类似查询的替代方案上使用分页的问题!
为了解决这个问题,我更改了/..../Query/Builder.php中的一些代码:
$total = $this->getCountForPagination($columns);
Run Code Online (Sandbox Code Playgroud)
对此:
$all = $this->get();
$total = $all->count();
Run Code Online (Sandbox Code Playgroud)
对于这种情况,我知道这是错误的,但现在它有效!
我该怎么做才能以正确的方式解决这个问题?
小智 0
你可以试试这个:
像这样编写原始查询:
DB::select('RAW_QUERY');
Run Code Online (Sandbox Code Playgroud)
它将返回一个数组。您可以使用 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()));
}
Run Code Online (Sandbox Code Playgroud)