簡體   English   中英

Laravel QueryException繞過try-catch?

[英]Laravel QueryException bypassing try-catch?

我正在使用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
}

而現在它是這樣的:

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();
}

你的$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;
}

現在發生了什么,你的代碼將在$this->delete(); 上面並拋出異常。

所以它到達你的catch ,因此你調用$contact->delete(); 再一次。 所以它得到另一個QueryException ,沒有$this->softDelete設置回true

您需要做的是設置軟刪除並嘗試再次刪除它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM