簡體   English   中英

路線模型綁定和軟刪除 - Laravel 4

[英]Route Model Binding and Soft Deletes - Laravel 4

當使用軟刪除和路由到模型綁定時,如果它被“軟刪除”,則無法查看注入的模型時會出現這種情況。

例如

我有一個工作模型。 如果我“垃圾”其中一個模型然后打開垃圾並嘗試查看工作模型我得到404資源未找到。 我通過使用Route :: bind()函數解決了這個問題

Route::bind('job', function($id, $route) {

    return Job::withTrashed()->find($id);
});

雖然這看起來沒什么必要而且有點傻......有沒有辦法解決這個問題,所以我可以使用非常雄辯的一行綁定:

Route::model('job', 'Job');

Route :: model()在模型上使用find方法時,您可以簡單地覆蓋方法以檢索已刪除的對象:

class Job extends Eloquent
{
    public static function find($id, $columns = array('*'))
    {
        return parent::withTrashed()->find($id, $columns);
    }
}

現在,您可以使用不帶閉包的模型綁定

Route::model('job', 'Job');

使用不希望檢索已刪除對象的find方法時要小心。

您在問題中概述的內容似乎可以解決它。

稍微改進一下,您可能希望指定包含已刪除模型的特定鍵。

例如,有正常的路由模型綁定如下:

Route::model('job', 'Job');

並定義另一個鍵,如'anyjob',您也可以在其中查詢已刪除的作業:

Route::bind('anyjob', function($id) {    
    return Job::withTrashed()->find($id);
});

然后,對於您不想包含已刪除作業的路線,您只需參考job

get('/jobs/{job}/edit', ['controller' => 'JobsController@edit']); // We don't want to be able to edit a trashed job.

並且只引用可以接受已刪除作業的路徑的anyjob綁定:

delete('/jobs/{anyjob}', ['controller' => 'JobsController@destroy']); // we could then forceDelete the trashed job for example as it'll be correctly injected in out our controller method

這可以防止您最終使用控制器方法中的軟刪除模型,否則這些模型應該不會處理它們。 您可以指定可以接受任何作業的確切路由,甚至只是刪除已刪除的作業。

除此之外,如果您已經構建了自己的特征和范圍,則可以在其中定義查找功能。 例如,我有一個“approvedTrait”,其工作方式相同,但有一個“已批准”欄目,以顯示某些事情是否得到了主持人的批准。 然后我把它放在我的approvedTrait類中:

public static function find($id, $columns = array('*'))
{
    return self::withUnapproved()->find($id, $columns);
}

暫無
暫無

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

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