gpt4 book ai didi

php - Laravel QueryException 绕过 try-catch?

转载 作者:可可西里 更新时间:2023-11-01 13:26:18 24 4
gpt4 key购买 nike

我正在使用 Laravel 4 和 Eloquent ORM。在我的系统中,当有人删除一条记录时,它必须检查它是否有任何关联的记录。如果没有,那么它可能会被永久删除。但如果确实如此,只需执行 softDeletion。

处理这种情况的方法是:尝试forceDelete,如果它因为引用完整性而抛出异常,则捕获它并进行softDelete。我知道这看起来很花哨,但它是由另一位开发人员制作的,我不想弄乱他的代码。

他做的是删除,然后如果抛出Exception,只要设置一个flag来“停用”这条记录。它确实运作良好。然而,当我接手时,我实现了 softDeleting 来让事情不那么花哨。

现在,当它尝试强制删除时,它会抛出 QueryException 但不会落入 catch block 。我试过将 Exception 更改为\Exception、QueryException、Illuminate\Database\QueryException,但没有成功。有什么想法吗?

为了更好地说明它:

是这样的:

try
{
$contact->delete();
}
catch(Exception $ex)
{
$contact->status = 0;
$contact->save();
//this works
}

现在是这样的:

protected $softDelete = true;

....

try
{
$contact->forceDelete();
}
catch(Exception $ex)
{
$contact->delete();
//this doesn't work
}

Firebug 响应:

{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[23000]: Integrity constraint violation: 1451 
Cannot delete or update a parent row: a foreign key constraint fails (`tst_db\/contact_company`, CONSTRAINT `fk_contact_company_contacts_id`
FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE)
(SQL: delete from `contacts` where `id` = 28)","file":"\/Applications\/XAMPP\/xamppfiles\/htdocs\/application\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":555}}

这是来自 Illuminate/Database/Eloquent/Builder.php 的 forceDelete() 函数:

    public function forceDelete()
{
return $this->query->delete();
}

最佳答案

您的 $contact->forceDelete(); 将调用 Illuminate\Database\Eloquent\Model 中的方法,其中有 the following code :

public function forceDelete()
{
$softDelete = $this->softDelete;

// We will temporarily disable false delete to allow us to perform the real
// delete operation against the model. We will then restore the deleting
// state to what this was prior to this given hard deleting operation.
$this->softDelete = false;

$this->delete();

$this->softDelete = $softDelete;
}

现在发生的事情是您的代码将在上面的 $this->delete(); 上出错并抛出异常。

因此它到达了您的catch,因此您再次调用$contact->delete();。所以它得到另一个 QueryException,没有 $this->softDelete 设置回 true

您需要做的是将软删除设置回来并尝试再次删除它:

try
{
$contact->forceDelete();
}
catch(Exception $ex)
{
$contact->softDelete = true;
$contact->delete();
}

关于php - Laravel QueryException 绕过 try-catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24312132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com