我正在使用 Laravel 4 和 Eloquent ORM。在我的系统中,当有人删除一条记录时,它必须检查它是否有任何关联的记录。如果没有,那么它可能会被永久删除。但如果是这样,只需执行一次 softDeletion。
处理这种情况的方式是:尝试强制删除,如果它因为引用完整性而抛出异常,则捕获它并软删除。我知道这看起来很花哨,但它是由另一个开发人员制作的,我不想弄乱他的代码。
他所做的是删除,然后如果它抛出异常,只需设置一个标志以“停用”记录。它确实运作良好。然而,当我接手时,我实施了 softDeleting 以减少花哨的东西。
现在,当它尝试强制删除时,它会抛出 QueryException 但不会落入 catch 块。我尝试将 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
}
萤火虫回应:
{"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();
}