Правило exists
Правило exists проверяет, что значение поля существует в указанной таблице и колонке базы данных. Оно используется в валидации для проверки связей между таблицами, например, при проверке существования пользователя, категории или другого связанного ресурса. Первым параметром передаётся имя таблицы, вторым - имя колонки (по умолчанию имя проверяемого поля).
Синтаксис
Правило может быть записано несколькими способами:
<?php
// Строковый формат
$rules = [
'user_id' => 'exists:users,id'
];
// Массивный формат
$rules = [
'user_id' => ['exists:users,id']
];
// С использованием Rule::exists
use Illuminate\Validation\Rule;
$rules = [
'user_id' => Rule::exists('users', 'id')
];
?>
Правило принимает два основных параметра: первый - имя таблицы, второй - имя колонки. Если второй параметр не указан, используется имя поля.
Пример
Проверим, что идентификатор пользователя существует в таблице users:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function update(Request $request)
{
$validated = $request->validate([
'user_id' => 'required|exists:users,id'
]);
// Дальнейшая логика
echo "User ID: " . $validated['user_id'];
}
}
?>
Результат выполнения кода при успешной валидации:
"User ID: 5"
Результат при ошибке валидации:
"Validation error: The selected user id is invalid."
Пример
Проверим существование категории в таблице categories с указанием конкретной колонки:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class ArticleController extends Controller
{
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'category_slug' => [
'required',
'string',
Rule::exists('categories', 'slug')
]
]);
echo "Article created with category: " . $validated['category_slug'];
}
}
?>
Результат выполнения кода при успешной валидации:
"Article created with category: programming"
Пример
Использование дополнительных условий в правиле exists:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
class OrderController extends Controller
{
public function create(Request $request)
{
$validated = $request->validate([
'product_id' => [
'required',
'integer',
Rule::exists('products', 'id')
->where(function ($query) {
$query->where('is_active', true);
})
]
]);
echo "Product ID: " . $validated['product_id'];
}
}
?>
Результат выполнения кода при успешной валидации:
"Product ID: 12"