Laravel搜索分页报错Call to a member function paginate() on string
报错根因
代码括号位置错误,->paginate(5)被错误写在where方法的第三个参数内部,实际是对拼接后的搜索字符串'%' .$request->search. '%'调用分页方法,字符串类型不存在paginate成员方法,因此触发报错。
原错误代码等效于以下逻辑,必然触发报错:
// 错误逻辑拆解 $searchStr = '%' .$request->search. '%'->paginate(5); // 对字符串调用成员方法 $data = rekap::where('customer','LIKE', $searchStr);
修复方案
调整括号位置,让paginate()作为查询构造器的链式方法调用,同时补上搜索参数透传逻辑,避免翻页时丢失搜索条件,修正后的控制器代码如下:
public function index(Request $request) { if ($request->has('search')) { // where方法闭合后再调用paginate $data = rekap::where('customer', 'LIKE', '%' . $request->search . '%')->paginate(5); } else { $data = rekap::paginate(5); } // 分页链接附加请求参数,保留搜索状态 $data->appends($request->all()); return view('rekap', compact('data')); }
原有视图部分的表单、分页渲染代码不需要修改,可正常运行。
可选优化写法
可以用when方法简化条件判断,同时给搜索参数加默认空值容错,代码更简洁:
public function index(Request $request) { $keyword = $request->input('search', ''); $data = rekap::when($keyword, function($query) use ($keyword) { $query->where('customer', 'LIKE', "%{$keyword}%"); }) ->paginate(5) ->appends($request->all()); return view('rekap', compact('data')); }
另外建议模型类名遵循PHP大驼峰命名规范,将rekap修改为Rekap,符合Laravel框架默认命名约定。
内容的提问来源于stack exchange,提问作者ken thoriqi
相关产品推荐
相关产品推荐

