2017-05-06 61 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();