Исключение QueryException
Исключение QueryException выбрасывается Laravel, когда при выполнении запроса к базе данных происходит ошибка. Это может быть синтаксическая ошибка в SQL-запросе, нарушение ограничений целостности данных, проблемы с подключением к базе данных или другие ошибки, связанные с работой с БД. Исключение содержит информацию о выполнении запроса, включая текст SQL-запроса, параметры и код ошибки.
Синтаксис
<?php
use Illuminate\Database\QueryException;
try {
// Выполнение запроса
$users = DB::table('users')->where('id', 1)->first();
} catch (QueryException $e) {
// Обработка ошибки
$sql = $e->getSql();
$bindings = $e->getBindings();
$code = $e->getCode();
$message = $e->getMessage();
}
?>
Пример
Давайте попробуем выполнить запрос к несуществующей таблице и перехватим исключение:
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Database\QueryException;
try {
$users = DB::table('non_existent_table')->get();
echo "Запрос выполнен успешно";
} catch (QueryException $e) {
echo "Ошибка запроса: " . $e->getMessage();
}
?>
Результат выполнения кода:
"Ошибка запроса: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'database.non_existent_table' doesn't exist"
Пример
Рассмотрим ситуацию с нарушением уникального ограничения при вставке дублирующихся данных:
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Database\QueryException;
try {
// Попытка вставить пользователя с уже существующим email
DB::table('users')->insert([
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => bcrypt('password')
]);
echo "Пользователь создан";
} catch (QueryException $e) {
echo "Ошибка вставки: " . $e->getMessage();
}
?>
Результат выполнения кода:
"Ошибка вставки: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'john@example.com' for key 'users_email_unique'"
Пример
Получим детальную информацию об ошибке, включая SQL-запрос и параметры:
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Database\QueryException;
try {
$users = DB::table('users')->where('age', '>', 150)->get();
} catch (QueryException $e) {
echo "SQL запрос: " . $e->getSql() . "\n";
echo "Параметры: " . implode(', ', $e->getBindings()) . "\n";
echo "Код ошибки: " . $e->getCode() . "\n";
echo "Сообщение: " . $e->getMessage();
}
?>
Результат выполнения кода:
"SQL запрос: select * from `users` where `age` > ?
Параметры: 150
Код ошибки: 0
Сообщение: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'age' in 'where clause'"
Пример
Обработаем ошибку с использованием транзакции для сохранения целостности данных:
<?php
use Illuminate\Support\Facades\DB;
use Illuminate\Database\QueryException;
DB::beginTransaction();
try {
DB::table('users')->insert([
'name' => 'Jane Smith',
'email' => 'jane@example.com'
]);
DB::table('profiles')->insert([
'user_id' => 1,
'bio' => 'User bio'
]);
DB::commit();
echo "Транзакция успешно выполнена";
} catch (QueryException $e) {
DB::rollBack();
echo "Транзакция отменена: " . $e->getMessage();
}
?>
Результат выполнения кода:
"Транзакция отменена: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails"
Смотрите также
-
исключение
ModelNotFoundException,
которое выбрасывается при ненайденной модели -
исключение
MultipleRecordsFoundException,
которое выбрасывается при обнаружении нескольких записей -
исключение
UniqueConstraintViolationException,
которое выбрасывается при нарушении уникальности -
исключение
RecordsNotFoundException,
которое выбрасывается при отсутствии записей