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

如何使用Laravel查询构造器获取关联表中无匹配的tb_teachers记录

使用Laravel查询构造器获取目标记录

这问题我刚好处理过,给你两种常用的Laravel查询构造器写法,都能精准实现需求:

方法1:左连接(Left Join)+ 空值判断

这种方式通过左连接关联两张表,然后筛选出关联表中无匹配记录的结果,逻辑清晰易懂:

use Illuminate\Support\Facades\DB;

$teachers = DB::table('tb_teachers as t')
    ->leftJoin('tb_class_to_teachers as ctt', function ($join) {
        $join->on('t.id', '=', 'ctt.teacher_id')
             ->where('t.school_id', '=', 'ctt.school_id');
    })
    ->whereNull('ctt.id') // 关联表无匹配记录时id为空
    ->select('t.*') // 只返回tb_teachers的字段
    ->get();

逻辑说明:

  • 用leftJoin把tb_teachers和tb_class_to_teachers按teacher_id + school_id的组合关联起来
  • 左连接会保留tb_teachers的所有记录,即使关联表中没有匹配项
  • 通过whereNull('ctt.id')筛选出那些在tb_class_to_teachers中找不到对应组合的老师记录

方法2:使用whereNotExists子查询

如果更习惯用子查询的逻辑,这种写法会更直观,直接判断当前老师的id和school_id组合不存在于关联表中:

use Illuminate\Support\Facades\DB;

$teachers = DB::table('tb_teachers as t')
    ->whereNotExists(function ($query) {
        $query->select(DB::raw(1))
              ->from('tb_class_to_teachers as ctt')
              ->whereColumn('ctt.teacher_id', 't.id')
              ->whereColumn('ctt.school_id', 't.school_id');
    })
    ->get();

逻辑说明:

  • 子查询会检查当前老师的id和school_id组合是否存在于tb_class_to_teachers中
  • whereNotExists会只保留那些子查询返回空结果的老师记录,也就是目标数据

两种方法都能达到同样的效果,你可以根据自己的代码风格选择合适的写法~

内容的提问来源于stack exchange,提问作者Rummaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:12:38