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

获取非当前用户预约的课程: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:58:47