2017-09-03 138 views
0

這是我的模型:使用軟刪除laravel 5問題

$imageFile = ImageModel::where('id', 12)->first(); 

$imageFile是:

namespace App\Models\Admin; 

use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\SoftDeletes; 

class Image extends Model 
{ 
    use SoftDeletes; 
    //table 
    protected $table = 'images'; 
} 

如果添加我的特質,如果我用我的模型這樣我無法找到任何記錄總是null,如果我刪除我的特質正在工作。爲什麼?

+0

圖像#12被刪除?如果是這樣,你應該使用'Image :: withTrashed() - > where('id',12') - > first();'。 – Bytewave

+0

事實並非如此。正如我所說如果我刪除這部分'使用SoftDeletes;'從我的模式正在工作。我從'ImageModel :: where('id',12) - > first();'獲取數據。如果我保留,它是空的。 – Chester

+0

用軟刪除刪除意味着'deleted_at'字段不爲空。 – Dmitry

回答

1

從你所說的,它按預期工作。在Laravel中使用軟刪除特性時,不會從數據庫中刪除該模型。將模型傳遞給destroy()時,唯一發生的情況是deleted_at字段變爲非null。

如果你更深入Laravel的代碼,當你調用

ImageModel::where('id', 12)->first(); 

的softdelete特點是增加

where null 

到SQL的deleted_at列。這就意味着,正如你所說的,如果關閉特質,$ imageFile不會爲空(它正在工作)。因爲softdelete從未從數據庫中刪除模型 - 它只是爲該模型的數據庫添加了非空值,因此對於正常的laravel查詢是可見的:當您不使用softdeletes時,Laravel不關心deleted_at字段,以便查看模型。當您打開軟刪除項時,它只會查找空值,並且由於您的模型已被軟刪除(它具有非空值),因此它會將$ imageFile返回爲null。

正如bytewave說,正確使用softdeletes有來無回空值$鏡像文件,你需要在softdeleted模型添加到您的查詢,像這樣:

Image::withTrashed()->where('id', 12')->first(); 

我認爲你正在尋找略有不同的功能(回滾),這與softdelete特性的意圖有點不同。該手冊非常好:5.4 soft-deletes,但深入研究特徵代碼也可能有幫助。

查看 - > restore()函數 - 這可能會幫助您更接近您正在尋找的預期回滾。但是,首先需要邏輯預先知道哪些被刪除。