如何正确使用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
相关产品推荐
相关产品推荐

