Eloquent多表关联查询(User/AttendanceUser/AttendanceSupervisor)Where子句失效问题排查求助
排查与修正你的关联查询问题
我来帮你一步步找出代码里的问题,让筛选条件正常生效:
1. 字段名拼写错误
你在where条件里把attendance_location写成了atttendance_location(多了一个t),数据库里根本没有这个字段,导致筛选条件相当于完全没起作用。两个地方都要修正:
attendance_supervisors.atttendance_location→attendance_supervisors.attendance_locationattendance_users.atttendance_location→attendance_users.attendance_location
2. 变量被单引号包裹,无法解析
你把$location放在了单引号里,PHP不会解析单引号内的变量,导致实际执行的SQL是匹配字符串'$location',而不是你传入的真实变量值。需要去掉单引号:
$query->where('attendance_supervisors.attendance_location', '=', $location) ->orWhere('attendance_users.attendance_location', '=', $location);
3. Join语句里的字段语法错误
第一个join中,你用逗号分隔表和字段:attendance_users,user_id,这是语法错误,应该用点号关联表和字段:attendance_users.user_id。
4. 方法名大小写不规范
Laravel查询构建器的方法是驼峰命名的,groupby应该改成groupBy,虽然部分环境不区分大小写,但遵循规范能避免潜在的兼容性问题。
修正后的完整代码
$new_attendance_user = AttendanceUser::join('users', 'users.id', '=', 'attendance_users.user_id') ->join('attendance_supervisors', 'users.id', '=', 'attendance_supervisors.user_id') ->groupBy('user_id') ->where(function($query) use ($location) { $query->where('attendance_supervisors.attendance_location', '=', $location) ->orWhere('attendance_users.attendance_location', '=', $location); }) ->get();
额外优化:利用Eloquent关联简化查询
既然你已经定义了模型关联,其实可以用更优雅的方式实现查询,避免手动写join:
$new_attendance_user = User::whereHas('attendance_users', function($query) use ($location) { $query->where('attendance_location', '=', $location); }) ->orWhereHas('attendance_supervisors', function($query) use ($location) { $query->where('attendance_location', '=', $location); }) ->with(['attendance_users', 'attendance_supervisors']) ->get();
这种方式更符合Eloquent的设计思想,代码也更易维护。
内容的提问来源于stack exchange,提问作者Yeo Bryan
相关产品推荐
相关产品推荐

