首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel QueryException绕过try-catch?

Laravel QueryException绕过try-catch?
EN

Stack Overflow用户
提问于 2014-06-20 00:51:25
回答 1查看 9.4K关注 0票数 6

我使用的是Laravel 4和雄辩的ORM。在我的系统中,当有人删除一条记录时,它必须检查它是否有关联的记录。如果没有,那么它可能会被永久删除。但如果是这样,只需执行一个softDeletion即可。

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

他所做的是删除,然后如果抛出一个异常,只需设置一个标志来“停用”记录。它确实工作得很好。然而,当我接管时,我实现了softDeleting,以使事情变得不那么花哨。

现在,当它尝试捕获时,它会抛出QueryException,但不会落入forceDelete块。我已经尝试将Exception更改为\Exception、QueryException、Database\,但没有成功。有什么想法吗?

为了更好地说明这一点:

它是这样的:

代码语言:javascript
复制
try
{
    $contact->delete();
}
catch(Exception $ex)
{
    $contact->status = 0;
    $contact->save();
    //this works
}

现在是这样的:

代码语言:javascript
复制
protected $softDelete = true;

....

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

Firebug响应:

代码语言:javascript
复制
{"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()函数:

代码语言:javascript
复制
    public function forceDelete()
{
    return $this->query->delete();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-20 01:21:29

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

代码语言:javascript
复制
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

您需要做的是将软删除设置回原处,然后再次尝试删除它:

代码语言:javascript
复制
try
{
    $contact->forceDelete();
}
catch(Exception $ex)
{
    $contact->softDelete = true;
    $contact->delete();
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24312132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档