获取非当前用户预约的课程:Laravel查询语句调试需求
修复你的Laravel查询问题
我帮你梳理下原查询里的问题,然后给出符合预期的写法:
原代码的核心错误
- 闭包无法访问外部变量:你在
whereNotExists的闭包里引用了$user,但没通过use($user)把变量传递进去,闭包默认无法获取外部作用域的变量。 whereRaw用法错误:whereRaw需要传入完整的SQL条件字符串,不能像where那样拆分参数。这里更推荐用whereColumn来跨表比较字段,既安全又易读。- 字符串字面量问题:你把
$user用单引号括起来了,这会让SQL把它当成固定字符串'$user'而非变量的值;另外字段名前的多余空格也可能导致匹配异常。
正确写法(按需求区分)
场景1:查询当前用户没有预约过的所有课程
不管其他用户是否预约,只要当前用户没预约的课程都返回:
$user = Auth::id(); $lessons = DB::table('lessons') ->whereNotExists(function ($query) use ($user) { $query->select(DB::raw(1)) ->from('bookings') ->whereColumn('bookings.lessons_id', 'lessons.id') ->where('bookings.user_id', '=', $user); }) ->get();
场景2:查询存在其他用户预约,且当前用户未预约的课程
只返回有其他用户预约、但自己没约的课程:
$user = Auth::id(); $lessons = DB::table('lessons') // 确保存在非当前用户的预约记录 ->whereExists(function ($query) use ($user) { $query->select(DB::raw(1)) ->from('bookings') ->whereColumn('bookings.lessons_id', 'lessons.id') ->where('bookings.user_id', '<>', $user); }) // 排除自己预约过的课程 ->whereNotExists(function ($query) use ($user) { $query->select(DB::raw(1)) ->from('bookings') ->whereColumn('bookings.lessons_id', 'lessons.id') ->where('bookings.user_id', '=', $user); }) ->get();
关键说明
use($user)是把外部的用户ID注入闭包的关键,确保SQL能正确获取当前用户的身份。whereColumn专门用于比较两个表的字段值,避免手动拼接SQL带来的注入风险,比whereRaw更适合这种跨表匹配场景。
内容的提问来源于stack exchange,提问作者James Moore
相关产品推荐
相关产品推荐

