Laravel 5.5 如何实现数据库搜索功能?附现有代码问题修复指南
现有代码问题梳理
- 参数获取方式错误:你调用
Souscription::get('q')是ORM的查询方法,无法获取前端传入的请求参数,应该通过注入的Request实例$request来获取请求值。 - 变量未定义:查询条件中使用的
$search变量没有在代码中声明赋值,直接调用会抛出变量未定义的错误。 - 搜索逻辑不匹配:你设置了两个请求参数
q(对应手机号)、q1(对应邮箱),但查询条件中却尝试用同一个不存在的$search同时匹配两个字段,和预期的参数接收逻辑完全不符。 - 参数判断逻辑错误:
isset()无法判断空字符串的情况,即使用户没传对应参数,$telephone和$email也会被赋值为null,isset不会返回false,同时你只在两个参数同时存在的情况下才执行查询,没有处理单参数搜索、无参数搜索的场景,容易出现变量未定义的报错。 - 视图传参错误:查询结果存储在
$fouilles变量中,但你compact传入的是不存在的$souscription变量,同时嵌套使用compact()属于语法错误,compact直接接收变量名字符串作为参数即可,不需要嵌套。
正确实现代码
public function search(Request $request) { // 从请求中获取搜索参数,未传参则默认是空字符串 $telephone = $request->get('q', ''); $email = $request->get('q1', ''); // 初始化查询构造器 $query = Souscription::query(); // 手机号不为空时追加手机号模糊查询条件 if (!empty($telephone)) { $query->where('telephone', 'LIKE', "%{$telephone}%"); } // 邮箱不为空时追加邮箱模糊查询条件 if (!empty($email)) { $query->where('email', 'LIKE', "%{$email}%"); } // 执行查询获取结果 $fouilles = $query->get(); // 将需要的变量传递到视图 return view('rechercher', compact('fouilles', 'telephone', 'email')); }
可选逻辑调整说明
如果需要实现「手机号匹配搜索词 或 邮箱匹配搜索词」的逻辑,把第二个where改成orWhere即可;如果需要无搜索参数时返回空列表,可在两个参数都为空的场景下直接给$fouilles赋值空集合collect()。
内容的提问来源于stack exchange,提问作者Cedric Djiré
相关产品推荐
相关产品推荐

