Laravel在when条件内调用paginate实现动态分页时出现length undefined报错
解决方案
核心问题原因
- 你将
paginate方法放在when条件的闭包内,且未将执行结果返回给外层链式调用。同时如果$request->size参数不存在时,整条查询链最终返回的是查询构造器实例而非标准分页对象,前端接收的数据缺少预期的数组结构/分页字段,就会触发length undefined报错。 - 额外注意:你当前的搜索逻辑存在SQL逻辑漏洞,所有
orWhere条件没有包裹分组,会导致全局的company_id过滤条件失效,最终会查询到其他企业的匹配数据。
修正后代码
$groups = Group::where('company_id', Auth::user()->company_id) ->when($request->search, function($query, $term) { // 将所有模糊搜索条件包裹在同一层级的where闭包中,避免破坏company_id的全局过滤 $query->where(function($q) use ($term) { $q->where('code', 'LIKE' , '%' . $term . '%') ->orWhere('name', 'LIKE' , '%' . $term . '%') ->orWhere('description', 'LIKE' , '%' . $term . '%'); }); }) ->when($request->column, function($query, $term) use ($request) { $query->orderBy($term, $request->order); }) // paginate放在链式调用最外层,设置默认分页条数保证返回结构统一 ->paginate($request->input('size', 10));
前端适配注意
如果使用Inertia将分页数据返回给Vue侧,分页对象的列表数据默认存放在data属性下,你需要通过groups.data来遍历列表,不要直接遍历根分页对象,否则也会出现length undefined报错。
内容的提问来源于stack exchange,提问作者kgcusi
相关产品推荐
相关产品推荐

