Laravel: получение неназначенных записей из базы данных

Я строю простую систему мониторинга посещаемости с 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();

я что-то упустил по этому запросу?

Спасибо, парни!

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();
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector