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

如何正确使用Laravel Paginator实现带where条件的分页查询?

问题原因

你的代码问题出在提前调用了first()方法:
first()属于立即执行查询的终止方法,调用后会返回单个Customer模型实例,而非可链式调用的查询构造器对象。此时在模型实例上调用paginate(),相当于重新初始化了全表查询的构造器,之前的where条件会完全失效,因此返回了全部客户数据。

解决方案

保留查询构造器链式调用,不要提前调用first()即可保留where条件,根据你的使用场景可以选择以下两种实现方式:

方式1:复用Laravel原生分页逻辑

Laravel内置的paginate()方法默认按页码分页,你可以将传入的偏移量转换为对应页码,参数直接映射你的需求:

$result = Customer::where("customer_id", $request->customer_id)
    ->paginate(
        perPage: $request->limit, // 每页展示条数
        columns: ['*'], // 查询字段
        page: (int) ($request->offset / $request->limit) + 1 // 由偏移量计算对应页码
    )
    ->toArray();

该写法会自动生成分页链接、总页数等标准分页结构,适合绝大多数常规分页场景。

方式2:自定义偏移量分页

如果你需要严格按传入的偏移量执行查询,不受页码规则限制,可以手动构造分页对象:

// 统计符合条件的总记录数
$total = Customer::where("customer_id", $request->customer_id)->count();
// 按自定义偏移量、条数查询当前页数据
$records = Customer::where("customer_id", $request->customer_id)
    ->offset($request->offset)
    ->limit($request->limit)
    ->get(['*']); // 可替换为你需要的查询字段

// 生成和原生paginate结构完全一致的分页结果
$result = new \Illuminate\Pagination\LengthAwarePaginator(
    $records,
    $total,
    $request->limit,
    null,
    ['path' => $request->fullUrl()]
)->toArray();

内容的提问来源于stack exchange,提问作者Göktuğ Ozleyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:24:06