
Laravel 的 DB::select() 返回的是原生数组,不支持链式调用 paginate();必须改用查询构建器(DB::table())才能启用 Eloquent 风格的分页功能。
laravel 的 `db::select()` 返回的是原生数组,不支持链式调用 `paginate()`;必须改用查询构建器(`db::table()`)才能启用 eloquent 风格的分页功能。
在 Laravel 中,对数据库结果进行分页时,关键前提在于:只有查询构建器(Query Builder)或 Eloquent 模型的查询实例才支持 paginate() 方法;而 DB::select() 执行的是原始 SQL 查询,其返回值是 PHP 数组,自然无法调用 paginate() —— 这正是你遇到 Call to a member function paginate() on array 错误的根本原因。
✅ 正确做法是使用 DB::table() 构建可分页的查询链:
public function index()
{
$data = DB::table('articles')
->where('articleCategory', 'Economie')
->whereRaw('articleDate = CURDATE()') // 注意:字段名无需反引号(除非含特殊字符),Laravel 会自动转义
->orderBy('articleDate', 'desc')
->orderBy('articleHour', 'desc')
->orderBy('articleMinute', 'asc')
->orderBy('articleSeconde', 'asc')
->paginate(10); // 每页显示 10 条,参数可省略(默认 15 条)
return view('business', compact('data'));
}
? 注意事项与最佳实践:
- ✅
->paginate()会自动处理LIMIT、OFFSET及总记录数统计(通过额外COUNT(*)查询),并注入分页器实例到视图中; - ✅ 在 Blade 模板中,直接使用
{{ $data->links() }}即可渲染分页导航; - ⚠️ 避免混用
DB::select()和分页逻辑——若必须执行复杂原生 SQL,可先用DB::select()获取 ID 列表,再结合whereIn()+paginate()实现间接分页(但性能与可维护性较差,不推荐); - ? 替代方案:如需更灵活的时间比较,建议使用
->whereDate('articleDate', now())替代CURDATE(),既语义清晰又兼容不同数据库(如 SQLite); - ? 确保
articleDate字段类型为DATE或DATETIME,否则CURDATE()比较可能失效。
最后,在视图 business.blade.php 中,除遍历 $data 外,务必添加分页控件:
@foreach($data as $article)
<div>{{ $article->title }}</div>
@endforeach
{{ $data->links() }}
这样即可实现高性能、开箱即用的服务器端分页体验。











