Метод whereNotExists
Метод whereNotExists применяется к запросу Eloquent
или Query Builder и возвращает тот же запрос,
дополненный условием NOT EXISTS. В качестве
единственного параметра передаётся замыкание, которое
принимает экземпляр построителя запросов для подзапроса.
Этот метод полезен для выборки записей, у которых
нет связанных записей в другой таблице.
Синтаксис
<?php
Model::whereNotExists(Closure $callback);
?>
Пример
Давайте выберем всех пользователей, у которых
нет ни одной статьи. Подзапрос будет проверять
наличие записей в таблице posts, связанных
с текущим пользователем по полю user_id:
<?php
use App\Models\User;
$users = User::whereNotExists(function ($query) {
$query->select('id')
->from('posts')
->whereColumn('posts.user_id', 'users.id');
})->get();
foreach ($users as $user) {
echo "User ID: " . $user->id . ", Name: " . $user->name;
}
?>
Пример
Давайте найдём категории, к которым не привязано
ни одного товара. Используем подзапрос с
условием связи по полю category_id:
<?php
use App\Models\Category;
$categories = Category::whereNotExists(function ($query) {
$query->select('id')
->from('products')
->whereColumn('products.category_id', 'categories.id');
})->get();
foreach ($categories as $category) {
echo $category->name;
}
?>
Пример
Выберем заказы, у которых нет ни одного товара в корзине. В подзапросе используем дополнительное условие для проверки статуса товаров:
<?php
use App\Models\Order;
$orders = Order::whereNotExists(function ($query) {
$query->select('id')
->from('order_items')
->whereColumn('order_items.order_id', 'orders.id')
->where('order_items.status', 'active');
})->get();
foreach ($orders as $order) {
echo "Order ID: " . $order->id;
}
?>
Смотрите также
-
метод
whereExists,
который проверяет наличие записей в подзапросе -
метод
whereNotIn,
который исключает записи по списку значений -
метод
whereNull,
который выбирает записи с пустым полем -
метод
get,
который выполняет запрос и возвращает коллекцию