В Laravel часто встречаются сценарии, когда вам нужно выбрать записи из одной таблицы на основе условия, включающего другую таблицу. Одним из конкретных случаев является выбор записей из таблицы, идентификатор которой не существует в другой таблице. В этой статье блога мы рассмотрим пять различных способов добиться этого в Laravel, используя разговорный язык и предоставляя примеры кода.
Метод 1: использование подзапроса.
Один подход заключается в использовании подзапроса для получения идентификаторов из второй таблицы, а затем выполнении запроса «НЕ ВХОДИТ» для фильтрации записей в первой таблице. Вот пример:
$excludedIds = DB::table('second_table')
->pluck('id');
$results = DB::table('first_table')
->whereNotIn('id', $excludedIds)
->get();
Метод 2: левое соединение с проверкой NULL
Другой метод включает в себя выполнение левого соединения между двумя таблицами и последующую проверку значений NULL в объединенном столбце. Этот метод может быть более эффективным для больших наборов данных. Вот пример:
$results = DB::table('first_table')
->leftJoin('second_table', 'first_table.id', '=', 'second_table.id')
->whereNull('second_table.id')
->select('first_table.*')
->get();
Метод 3: использование предложения WhereNotExists
Построитель запросов Laravel предоставляет удобный методwhereNotExists, который позволяет проверить отсутствие записей в другой таблице. Вот пример:
$results = DB::table('first_table')
->whereNotExists(function ($query) {
$query->select(DB::raw(1))
->from('second_table')
->whereRaw('first_table.id = second_table.id');
})
->get();
Метод 4: подзапрос с «NOT EXISTS»
Подобно предыдущему методу, вы можете использовать подзапрос с «NOT EXISTS» для достижения желаемого результата. Вот пример:
$results = DB::table('first_table')
->whereRaw('NOT EXISTS (SELECT 1 FROM second_table WHERE first_table.id = second_table.id)')
->get();
Метод 5: использование связей Eloquent
Если вы работаете с моделями Eloquent и определили связи между таблицами, вы можете использовать эти связи для выбора записей. Вот пример:
$results = FirstModel::whereDoesntHave('secondTableRelation')
->get();
В этой статье мы рассмотрели пять различных методов выбора записей из одной таблицы, идентификатор которых не существует в другой таблице. Каждый метод имеет свои преимущества, поэтому выберите тот, который лучше всего соответствует вашим конкретным требованиям. Используя эти методы в Laravel, вы сможете эффективно фильтровать и извлекать нужные данные.