我使用的是Laravel 4和雄辩的ORM。在我的系统中,当有人删除一条记录时,它必须检查它是否有关联的记录。如果没有,那么它可能会被永久删除。但如果是这样,只需执行一个softDeletion即可。
处理这种情况的方法是:尝试forceDelete,如果由于引用完整性而抛出异常,则捕获它并执行softDelete。我知道这看起来有点花招,但它是由另一个开发人员开发的,我不想弄乱他的代码。
他所做的是删除,然后如果抛出一个异常,只需设置一个标志来“停用”记录。它确实工作得很好。然而,当我接管时,我实现了softDeleting,以使事情变得不那么花哨。
现在,当它尝试捕获时,它会抛出QueryException,但不会落入forceDelete块。我已经尝试将Exception更改为\Exception、QueryException、Database\,但没有成功。有什么想法吗?
为了更好地说明这一点:
它是这样的:
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}}这是来自Database/Database/Eloquent/Builder.php的forceDelete()函数:
public function forceDelete()
{
return $this->query->delete();
}发布于 2014-06-20 01:21:29
您的$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();
}https://stackoverflow.com/questions/24312132
复制相似问题