Laravel原生DB查询分页报错:Call to a member function paginate() on array
解决Laravel原生SQL分页报错「Call to a member function paginate() on array」
DB::select()执行原生SQL后直接返回结果数组,而paginate()是Laravel查询构建器(Query Builder)或Eloquent模型专属的方法,数组对象没有这个方法,因此触发报错。以下是两种可行的解决方式:
方案一:用查询构建器重写逻辑(推荐)
将原生SQL逻辑转换为查询构建器语法,即可直接调用paginate()方法,Laravel会自动处理分页链接和参数:
$all_user = DB::table('users') ->selectRaw('*, "STATUS" AS STAT, CASE WHEN TIMESTAMPDIFF(MINUTE, updated_at, NOW()) <= 1 THEN "online" WHEN TIMESTAMPDIFF(MINUTE, updated_at, NOW()) > 30 AND TIMESTAMPDIFF(MINUTE, updated_at, NOW()) <= 720 THEN "idle" ELSE "offline" END AS user_status') ->paginate(20); return $all_user;
注意:原SQL中
idle的条件逻辑错误(>720且<=30永远无法成立),这里已修正为>30且<=720,若你的业务逻辑有特殊需求,请自行调整。
方案二:手动实现原生SQL分页
如果必须使用原生SQL,可通过LengthAwarePaginator手动构建分页实例:
use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Request; // 获取分页参数 $page = Request::get('page', 1); $perPage = 20; $offset = ($page - 1) * $perPage; // 查询当前页数据 $users = DB::select("SELECT *, 'STATUS' AS STAT, CASE WHEN TIMESTAMPDIFF(MINUTE, updated_at, NOW()) <= 1 THEN 'online' WHEN TIMESTAMPDIFF(MINUTE, updated_at, NOW()) > 30 AND TIMESTAMPDIFF(MINUTE, updated_at, NOW()) <= 720 THEN 'idle' ELSE 'offline' END AS user_status FROM users LIMIT ?, ?", [$offset, $perPage]); // 查询总数据量 $total = DB::select("SELECT COUNT(*) AS total FROM users")[0]->total; // 构建分页实例 $all_user = new LengthAwarePaginator( $users, $total, $perPage, $page, ['path' => Request::url(), 'query' => Request::query()] ); return $all_user;
内容的提问来源于stack exchange,提问作者Satyajit Barik
相关产品推荐
相关产品推荐

