2017-05-06 59 views
0

我正在用Laravel构建一个简单的考勤监控系统。我有两个相关的表teachers表和grade_levels表。Laravel:从数据库检索未分配的记录

这里有两个

教师表

id(PK)

advisory_class(FK)表结构 - >引用ID上grade_levels

teacher_name

级水平表

id(PK)

grade_level

section

什么,我试图做的是从尚未分配给老师从teachers table

grade_levels表检索所有记录

我该如何查询这与Laravel?

我试着做一个连接查询,但我得到了指定教师的记录。

$teachers = DB::table('teachers') ->join('grade_levels','teachers.advisory_class', '=', 'grade_levels.id') ->select('teachers.*','grade_levels.grade_lvl','grade_levels.section') ->get();

我失去了对这个查询的东西吗?

谢谢你们!

+0

你需要一个'leftJoin()'和'whereNull()'。或者是一个带有子查询的'whereNotIn()'。如果您正确设置了模型关系,'doesntHave()'也可能起作用。 –

回答

0

如果你想从父表A中有子表B中没有匹配的所有行,查询应该是这样的:

SELECT a.* 
FROM a 
LEFT JOIN b ON b.fk = a.pk 
WHERE b.fk IS NULL 

所以你的情况这竟被是:

$gradeLevels = DB::table('grade_levels') 
    ->leftJoin('teachers','teachers.advisory_class', '=', 'grade_levels.id') 
    ->whereNull('teachers.advisory_class') 
    ->select('grade_levels.*') 
    ->get(); 

请注意,从teachers表中选择任何内容都没有任何意义,因为您正在搜索没有分配教师的“年级”。

使用的机型,这也可能工作:

$gradeLevels = GradeLevel::whereNotIn('id', Teacher::select(advisory_class))->get();