捕获查询异常?

Catching a query exception?

我的数据库中有一个 slug 列,它是唯一的。

如果我尝试存储具有非唯一 slug 的另一行,我会收到 QueryException 错误。

我发现了这个错误,并希望 return 一条类似 "slug exists".

的错误消息
try {
    User::create($data);
} catch (\Illuminate\Database\QueryException $e) {
    //return the error
}

上面很好,但我只是想知道,如果抛出另一个 QueryException,与重复的 slug 无关并且我 return 错误消息重复的 slug 怎么办。

有没有办法找出查询异常是什么,并return基于此的错误消息?我知道异常提供了它自己的消息,但我希望有一些更用户友好的东西。

可以查看异常对象的errorInfo

看起来像这样..

+errorInfo: array:3 [▼
0 => "23000"
1 => 1062
2 => "Duplicate entry 'abc@gmail.com' for key 'users_email_unique'"

你可以在catch中写如下代码..

 try{}
    catch(QueryException $qe){
    If ($qe->errorInfo[0] == "23000" && $qe->errorInfo[1] == "1062"){
        return "Your message"
    }else{
        return "General Message"
    } 
}

要检查您是否因为重复而得到 QueryException,请检查 $e->getCode() 是否等于 23000

当由于约束而出现重复时,MySQL 将发出 signal SQLSTATE 23000,您可以使用它来确定到底出了什么问题。您可以在 MySQL 中实现您自己的信号以发出有关各种错误的信号(通过触发器等)

示例:

try {
    User::create($data);
} catch (\Illuminate\Database\QueryException $e) {
    if($e->getCode() === '23000') {
        // you got the duplicate
    }
}