Gus*_*lva 6 php exception soft-delete php-5.3 laravel
我正在使用Laravel 4和Eloquent ORM.在我的系统中,当有人删除记录时,必须检查它是否有任何相关记录.如果没有,则可以永久删除.但如果确实如此,只需执行softDeletion即可.
处理这种情况的方法是:尝试强制删除,如果由于引用完整性而抛出异常,则捕获它和softDelete.我知道这看起来很花哨,但它是由另一个开发人员制作的,我宁愿不要弄乱他的代码.
他所做的就是删除,然后如果它抛出异常,只需设置一个标志来"停用"记录.它确实运作良好.然而,当我接手时,我实现了softDeleting以减少花哨的东西.
现在,当它尝试强制删除时,它会抛出QueryException,但不会落入catch块.我已经尝试将Exception更改为\ Exception,QueryException,Illuminate\Database\QueryException,但没有成功.有任何想法吗?
为了更好地说明它:
就像这样:
try
{
$contact->delete();
}
catch(Exception $ex)
{
$contact->status = 0;
$contact->save();
//this works
}
Run Code Online (Sandbox Code Playgroud)
而现在它是这样的:
protected $softDelete = true;
....
try
{
$contact->forceDelete();
}
catch(Exception $ex)
{
$contact->delete();
//this doesn't work
}
Run Code Online (Sandbox Code Playgroud)
萤火虫响应:
{"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}}
Run Code Online (Sandbox Code Playgroud)
这是Illuminate/Database/Eloquent/Builder.php中的forceDelete()函数:
public function forceDelete()
{
return $this->query->delete();
}
Run Code Online (Sandbox Code Playgroud)
您将调用包含以下代码$contact->forceDelete();的方法:Illuminate\Database\Eloquent\Model
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;
}
Run Code Online (Sandbox Code Playgroud)
现在发生的情况是您的代码将在上面出错$this->delete();并抛出异常。
因此它到达了您的catch,因此您$contact->delete();再次致电。所以它得到了另一个QueryException,没有$this->softDelete设置回来true。
您需要做的就是重新设置软删除并尝试再次删除它:
try
{
$contact->forceDelete();
}
catch(Exception $ex)
{
$contact->softDelete = true;
$contact->delete();
}
Run Code Online (Sandbox Code Playgroud)