Проверка Laravel на нарушение ограничения

Мне было любопытно, есть ли способ, которым мы можем проверить, есть ли ошибка нарушения ограничения при удалении или вставке записи в базу данных.

Выданное исключение называется QueryException, но это может быть широкий диапазон ошибок. Было бы хорошо, если бы мы могли проверить в исключении, что является конкретной ошибкой.

12

Решение

Вы ищете 23000 Error code (Integrity Constraint Violation), Если вы посмотрите на QueryException класс, он распространяется от PDOException, так что вы можете получить доступ к $errorInfo переменная.

Чтобы поймать эту ошибку, вы можете попробовать:

try {
// ...

} catch (\Illuminate\Database\QueryException $e) {
var_dump($e->errorInfo);
}

// Example output from MySQL
array (size=3)
0 => string '23000' (length=5)
1 => int 1452
2 => string 'Cannot add or update a child row: a foreign key constraint fails (...)'

Чтобы быть более конкретным (дублирующая запись, не ноль, добавить / обновить дочернюю строку, удалить родительскую строку …), это зависит от каждой СУБД:

  • PostgreSQL а также SQL-сервер следовать соглашениям стандарта SQL для SQLSTATE код, так что вы можете вернуть первое значение из массива $e->errorInfo[0] или позвоните по телефону $e->getCode() непосредственно
  • MySQL, MariaDB а также SQLite не строго соблюдайте правила, поэтому вам нужно вернуть второе значение из массива $e->errorInfo[1]

Для laravel легко обрабатывать ошибки, просто добавьте этот код в файл «app / start / global.php» (или создайте поставщик услуг):

App::error(function(\Illuminate\Database\QueryException $exception)
{
$error = $exception->errorInfo;
// add your business logic
});
27

Другие решения

Вы также можете попробовать

try {
...
} catch ( \Exception $e) {
var_dump($e->errorInfo );
}

затем найдите код ошибки.

Это ловит все исключения, включая QueryException

2

сначала поместите это в свой контроллер

use Exception;

второй обработать ошибку с помощью try catch, как в этом примере

try{    //here trying to update email and phone in db which are unique values
DB::table('users')
->where('role_id',1)
->update($edit);
return redirect("admin/update_profile")
->with('update','update');
}catch(Exception $e){
//if email or phone exist before in db redirect with error messages
return redirect()->back()->with('phone_email','phone_email_exist before');
}

Новые обновления здесь без использования попробуй поймать Вы можете легко сделать это в правилах валидации, так как следующий код испортился

public function update(Request $request, $id)
{
$profile = request()->all();
$rules    = [
'name'                       => 'required|unique:users,id,'.$id,
'email'                      => 'required|email|unique:users,id,'.$id,
'phone'                      => 'required|unique:users,id,'.$id,
];
$validator = Validator::make($profile,$rules);
if ($validator->fails()){
return redirect()->back()->withInput($profile)->withErrors($validator);
}else{
if(!empty($profile['password'])){
$save['password'] = bcrypt($profile['password']);
}
$save['name']                  = $profile['name'];
$save['email']                 = $profile['email'];
$save['phone']                 = $profile['phone'];
$save['remember_token']        = $profile['_token'];
$save['updated_at']            = Carbon::now();

DB::table('users')->where('id',$id)->update($save);
return redirect()->back()->with('update','update');
}
}

где id относится к записи, которую вы редактируете.

2

Вы можете добавить следующий код в файл app / start / global.php, чтобы напечатать исключение

App::error(function(QueryException $exception)
{
print_r($exception->getMessage());
});

Проверь это часть в документации

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector