Laravel模型关联查询下多条件搜索报错问题求助
Laravel 多条件搜索问题修复
你的代码存在几个核心问题,导致搜索功能异常:
- 两次搜索逻辑互相覆盖:
$search变量被重复赋值,且每次搜索都重新创建查询并覆盖$leaves,最终只会执行最后一个条件的搜索 - 未判断搜索参数是否存在:当请求中没有
name或status参数时,%{$search}%会变成%%,导致匹配所有数据,逻辑不符合预期 - 重复编写JOIN和SELECT语句,造成代码冗余
修正后的控制器代码
// 构建基础查询(复用JOIN和SELECT逻辑) $leavesQuery = LeaveAdmin::join('users', 'users.rec_id', '=', 'leaves_admin.rec_id') ->select('leaves_admin.*', 'users.role_name', 'users.avatar'); // 处理姓名搜索:仅当存在name参数时添加条件 if ($name = request('name')) { $leavesQuery->where('leaves_admin.name', 'LIKE', "%{$name}%"); } // 处理状态搜索:仅当存在status参数时添加条件 if ($status = request('status')) { $leavesQuery->where('leaves_admin.status', 'LIKE', "%{$status}%"); } // 执行查询 $leaves = $leavesQuery->get(); // 如果需要传递userList到视图,记得在compact里添加 $userList = DB::table('users')->get(); return view('Leave.leaves', compact('leaves', 'userList'));
额外说明
- 上述代码中,多条件搜索默认是AND关系(即同时满足姓名和状态匹配),如果需要OR关系,可以修改为:
if ($name = request('name') || $status = request('status')) { $leavesQuery->where(function ($query) use ($name, $status) { if ($name) { $query->where('leaves_admin.name', 'LIKE', "%{$name}%"); } if ($status) { $query->orWhere('leaves_admin.status', 'LIKE', "%{$status}%"); } }); }
- 建议保持查询方式统一:要么全程使用
DB::table门面,要么使用Eloquent模型,避免混用导致混淆
内容的提问来源于stack exchange,提问作者Jay-ar Cristobal
相关产品推荐
相关产品推荐

