Я строю простую систему мониторинга посещаемости с Laravel. У меня есть две связанные таблицы teachers
стол и grade_levels
Таблица.
вот структура таблицы для обоих
Стол учителя
id(PK)
advisory_class(FK)
-> ссылочный идентификатор на grade_levels
Таблица
teacher_name
Таблица уровней
id(PK)
grade_level
section
что я пытаюсь сделать, это получить всю запись из grade_levels
таблица, которая еще не назначена учителю из teachers table
как мне сделать запрос с Laravel ??
Я попытался сделать запрос на соединение, но я получаю записи с назначенными учителями.
$teachers = DB::table('teachers')
->join('grade_levels','teachers.advisory_class', '=', 'grade_levels.id')
->select('teachers.*','grade_levels.grade_lvl','grade_levels.section')
->get();
я что-то упустил по этому запросу?
Спасибо, парни!
Если вы хотите получить все строки из родительской таблицы 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();
Других решений пока нет …