You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:35:26