
本文详解如何在 Laravel 中对数据库查询结果进行分页,重点解决使用原生 SQL 查询后无法调用 paginate() 方法的问题,并推荐使用 Query Builder 替代 DB::select() 以支持链式分页。
本文详解如何在 laravel 中对数据库查询结果进行分页,重点解决使用原生 sql 查询后无法调用 `paginate()` 方法的问题,并推荐使用 query builder 替代 `db::select()` 以支持链式分页。
在 Laravel 中,DB::select() 返回的是一个纯 PHP 数组(array),而 paginate() 是 Eloquent 查询构造器(Illuminate\Database\Query\Builder)或 Eloquent 模型实例才具备的方法。因此,当你对 DB::select() 的返回值直接调用 ->paginate(10) 时,会触发致命错误:Call to a member function paginate() on array。
正确的做法是改用 Laravel 的 Query Builder(即 DB::table()),它返回可链式调用的查询构造器实例,天然支持 paginate():
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 条
return view('business', compact('data'));
}✅ 优势说明:
- 自动处理
LIMIT/OFFSET、总记录数统计(通过COUNT(*)子查询); - 生成符合 Laravel 分页视图(如
resources/views/vendor/pagination/)所需的$data对象,包含links()、currentPage()、hasPages()等方法; - 支持 URL 参数保留(如搜索条件),默认自动识别
?page=2; - 可配合 Blade 模板直接渲染分页控件:
{{ $data->links() }}
⚠️ 注意事项:
- 避免混用
DB::select()与paginate()—— 它们属于不同抽象层级; - 若必须使用原生 SQL(如复杂窗口函数),可借助
DB::raw()配合 Query Builder,或手动实现分页(不推荐); -
CURDATE()是 MySQL 函数;若使用 PostgreSQL,应替换为CURRENT_DATE,并改用whereDate('articleDate', now())提升数据库兼容性; - 建议将
articleHour/articleMinute/articleSeconde合并为标准DATETIME字段(如article_published_at),既简化查询,又提升索引效率与时区安全性。
最后,在视图中遍历分页数据时,语法与普通集合一致:
@foreach ($data as $article)
<h3>{{ $article->title }}</h3>
<p>{{ $article->content }}</p>
@endforeach
{{ $data->links() }}这样即可实现高性能、可维护、符合 Laravel 最佳实践的数据库分页功能。


















