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
相关产品推荐
相关产品推荐

