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

Laravel 8中执行DB::select()->paginate(10)分页代码时报错求助

Laravel 8 原生SQL分页报错排查及解决方案

错误原因

  • DB::select() 执行完原生SQL后返回的是数组类型(或stdClass对象数组),并非Laravel查询构造器实例,本身不具备paginate()分页方法,直接调用会抛出方法不存在的错误。
  • SQL语句存在表名拼写错误:WHERE条件里的DESGINATION拼写错误,正确表名是DESIGNATION,拼写偏差会导致字段找不到的SQL报错。
  • 视图传参格式错误,直接传递$data变量到view()方法时,模板无法按变量名读取分页数据,需要传递键值对格式的参数。

修复方案

方案1:改用查询构造器实现(推荐)

查询构造器原生支持paginate()方法,无需手动处理分页逻辑,代码如下:

$data = DB::table('EMPLOYEE')
    ->leftJoin('DESIGNATION', 'EMPLOYEE.DGNO', '=', 'DESIGNATION.DGNO')
    ->where('DESIGNATION.NAME', 'IT')
    ->orderBy('EMPLOYEE.NAME')
    ->paginate(10);

return view('Employee.Index', compact('data'));

方案2:原生SQL手动分页

如果必须使用原生SQL编写,可以手动生成分页实例:

// 先获取总条数
$total = DB::select("SELECT COUNT(*) as count FROM EMPLOYEE LEFT JOIN DESIGNATION ON EMPLOYEE.DGNO = DESIGNATION.DGNO WHERE DESIGNATION.NAME='IT'")[0]->count;
// 处理分页参数
$perPage = 10;
$currentPage = request()->input('page', 1);
$offset = ($currentPage - 1) * $perPage;
// 拼接分页条件执行查询
$items = DB::select("SELECT * FROM EMPLOYEE LEFT JOIN DESIGNATION ON EMPLOYEE.DGNO = DESIGNATION.DGNO WHERE DESIGNATION.NAME='IT' ORDER BY EMPLOYEE.NAME LIMIT ? OFFSET ?", [$perPage, $offset]);
// 手动生成分页实例
$data = new \Illuminate\Pagination\LengthAwarePaginator($items, $total, $perPage, $currentPage, [
    'path' => request()->url(),
    'query' => request()->query()
]);

return view('Employee.Index', compact('data'));

模板调用说明

修复后在blade模板中可以直接调用分页方法输出分页链接:

{{ $data->links() }}

内容的提问来源于stack exchange,提问作者Sahiwala Software

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:36:03