Метод whereExists
Метод whereExists применяется к запросу Eloquent
или Query Builder и добавляет условие EXISTS в SQL-запрос.
В качестве единственного параметра передаётся замыкание,
в котором строится подзапрос. Основная задача метода -
выбрать те записи, для которых существует хотя бы одна
запись в подзапросе. Метод полезен для проверки наличия
связанных данных без их загрузки.
Синтаксис
<?php
Model::whereExists(Closure $callback);
?>
Пример
Давайте выберем всех пользователей, у которых есть хотя бы одна статья:
<?php
use App\Models\User;
use App\Models\Article;
$users = User::whereExists(function ($query) {
$query->selectRaw('1')
->from('articles')
->whereColumn('articles.user_id', 'users.id');
})->get();
foreach ($users as $user) {
echo $user->name;
}
?>
Результат выполнения кода:
"John Doe"
"Jane Smith"
"Mike Johnson"
Пример
Давайте отфильтруем категории, к которым привязаны активные товары:
<?php
use App\Models\Category;
use App\Models\Product;
$categories = Category::whereExists(function ($query) {
$query->select('id')
->from('products')
->whereColumn('products.category_id', 'categories.id')
->where('products.status', 'active');
})->get();
foreach ($categories as $category) {
echo $category->name;
}
?>
Результат выполнения кода:
"Electronics"
"Clothing"
"Books"
Пример
Давайте найдём заказы, у которых есть хотя бы один товар с ценой выше 1000 рублей:
<?php
use App\Models\Order;
use App\Models\OrderItem;
$orders = Order::whereExists(function ($query) {
$query->select('id')
->from('order_items')
->whereColumn('order_items.order_id', 'orders.id')
->where('order_items.price', '>', 1000);
})->get();
foreach ($orders as $order) {
echo $order->id;
}
?>
Результат выполнения кода:
"1"
"3"
"5"
"7"
Пример
Давайте выберем пользователей, у которых есть комментарии с длиной текста более 100 символов:
<?php
use App\Models\User;
use App\Models\Comment;
$users = User::whereExists(function ($query) {
$query->select('id')
->from('comments')
->whereColumn('comments.user_id', 'users.id')
->whereRaw('LENGTH(comments.text) > 100');
})->get();
foreach ($users as $user) {
echo $user->name;
}
?>
Результат выполнения кода:
"Alice"
"Bob"
Смотрите также
-
метод
whereNotExists,
который проверяет отсутствие записей в подзапросе -
метод
whereHas,
который добавляет условие по существованию отношений -
метод
whereDoesntHave,
который добавляет условие отсутствия отношений -
метод
get,
который выполняет запрос и возвращает коллекцию