You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:39:12