如何使用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
相关产品推荐
相关产品推荐

