2015-12-04 42 views
1

我有一個使用在Laravel軟刪除,並且還採用了特質包括boot功能的ModelSoftDeletes不過濾

class Design extends Model { 
    uses Softdeletes, Versionable; 
    // ... 
} 

trait Versionable { 
    public static function boot(){ 
    // ... 
    } 
} 

SoftDeletes本身仍能正常工作:deleted_at列正在被正確填充。然而,Designs::get()不正確過濾軟刪除型號:

return Designs::get(); 

[{"id":1,"project_id":1,"name":"","description":null,"created_at":"2015-12-04 21:06:40","updated_at":"2015-12-04 21:06:40","deleted_at":null}, 
{"id":2,"project_id":1,"name":"A Design","description":"a different description", "created_at":"2015-12-04 21:06:57","updated_at":"2015-12-04 21:07:09","deleted_at":"2015-12-04 21:07:09"}] 

卸下無論是Versionable性狀或boot方法從版本可控解決了這個問題。

爲什麼會發生這種情況,我該如何解決?

回答

3

首先,我假設你不會在你的trait的boot方法中調用parent::boot();,這就是你遇到這個問題的原因。您正在重寫父級的啓動方法。然而,我不會推薦這種方法的原因有幾個,Laravel實際上建議一個標準的命名約定,當涉及到添加啓動方法到你的特質。

如果你的特質有一個boot方法,它將覆蓋父模型的boot方法。您可以將parent::boot();方法添加到特徵的boot方法中以解決此問題,以便它也會調用父項boot方法。但是,如果你的模型有一個boot方法,它將基本上抹掉特徵的啓動方法。將啓動方法添加到您的特質中會產生潛在的衝突,無論是現在,以後,還是其他人試圖使用您的特質。

爲了解決這個問題,Laravel建議您使用以下格式命名trait的引導方法:boot{TraitName}

換句話說,你的特質被稱爲Versionable因此,如果您重命名的引導方法來這是你的代碼將工作:

public static function bootVersionable(){ 
    // ... 
} 

編輯:Source

如果雄辯的模型使用特徵它有一個匹配bootNameOfTrait命名約定的方法,當引導Eloquent模型時將會調用trait方法,爲您提供註冊全局範圍或執行其他任何操作的機會。

+0

謝謝,這工作完美。你有鏈接或來源Laravel提出這個建議的地方嗎? – whiterook6

+1

我不確定爲什麼沒有在文檔中提到L5.1,但在L5.0的文檔中簡單提及它。我已經編輯過了。:) –