2014-10-14 30 views
12

Tôi đã tò mò nếu có một cách chúng ta có thể kiểm tra nếu có một lỗi vi phạm ràng buộc khi xóa hoặc chèn một bản ghi vào cơ sở dữ liệu.Laravel kiểm tra vi phạm ràng buộc

Trường hợp ngoại lệ được gọi là 'QueryException' nhưng đây có thể là một loạt các lỗi. Sẽ được tốt đẹp nếu chúng ta có thể kiểm tra trong trường hợp ngoại lệ những gì các lỗi cụ thể là.

Trả lời

26

Bạn đang tìm kiếm 23000 Error code (Integrity Constraint Violation). Nếu bạn xem qua lớp QueryException, nó kéo dài từ PDOException, vì vậy bạn có thể truy cập vào biến số $errorInfo.

Để bắt lỗi này, bạn có thể thử:

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 (...)' 

Để cụ thể hơn (entry trùng lặp, không null, thêm/cập nhật hàng trẻ em, xóa hàng mẹ ...), nó phụ thuộc vào mỗi DBMS :

  • PostgreSQLSQL server theo quy ước tiêu chuẩn SQL cho SQLSTATE mã, do đó bạn có thể trả về giá trị đầu tiên từ mảng $e->errorInfo[0] hoặc gọi trực tiếp $e->getCode()
  • MySQL, MariaDBSQLite không chấp hành nghiêm chỉnh các quy tắc, vì vậy bạn cần phải trả về giá trị thứ hai từ mảng $e->errorInfo[1]

Đối laravel, xử lý lỗi này là dễ dàng, chỉ cần thêm đoạn mã này trong "app/bắt đầu/global.php" tập tin (hoặc tạo một service provider):

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

nó không làm việc với tôi: ( Vẫn còn vi phạm trang web – itsazzad

+0

hãy cụ thể hơn về lỗi này, có thể bạn đang sử dụng lỗi xử lý phù thủy Laravel 5 [ khác nhau] (http://laravel.com/docs/5.0/errors#handling-errors) – Razor

+0

im sử dụng laravel4 và thử bắt không hoạt động nếu có sự trùng lặp trong mục nhập cơ sở dữ liệu. Nó chỉ ném lỗi và tôi chưa biết cách bắt nó theo cách khác. – itsazzad

0

Bạn có thể thêm đoạn mã sau vào ứng dụng/bắt đầu tập tin/global.php để in các ngoại lệ

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

séc part này trong tài liệu

2

Bạn cũng có thể thử

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

sau đó tìm e mã rror.

này bắt tất cả các ngoại lệ bao gồm QueryException

0

đầu tiên đặt này trong điều khiển của bạn

use Exception; 

thứ hai xử lý các lỗi bằng cách sử dụng cố gắng nắm bắt như ví dụ này

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'); 
      } 
Các vấn đề liên quan