Laravel 提供了快速套用軟刪除的方法,直接在Model中加上use SoftDeletes即可:
use Illuminate\Database\Eloquent\SoftDeletes;
use SoftDeletes;
接著在程式中,假設要把文章1刪除,可以直接這樣寫:
Article::find(1)->delete();
不難發現,軟刪除其實就是壓上一個刪除時間,並不是真的把資料刪掉。
這邊需特別注意,使用軟刪除其實是會認table欄位deleted_at,因此記得table中要有這個欄位,才能正常運作。
還有一點要特別注意的是,使用軟刪除機制,這筆資料會被系統認為已經不存在了,所以在select的時候,預設不會把已經刪除的資料找出來,也就是deleted_at為空的才會被select出來。
另外,如果我再執行一次上述的Article::find(1)-delete(); 會發現有error:
Error: Call to a member function delete() on null
原因就是這筆已經被認為是刪除的資料,所以在find(1)的時候會找不到這筆,回傳null,所以才會有這個錯誤訊息。
那麼要怎麼找出被刪除的資料呢? 只要使用withTrashed()即可:
Article::withTrashed()->get()
這樣就會select出所有資料,包含被刪除的!
如果只想找出被刪除的,可以用onlyTrashed():
Article::onlyTrashed()->get();
所以上述改成這樣:
Article::onlyTrashed()->find(1)->delete();
//or
Article::withTrashed()->find(1)->delete();
就可以找的到第一筆文章了,也就不會再有錯誤,並且會把deleted_at時間再更新一次。
另外,在建migration的時候,若table有軟刪除需求,可以直接用這個方式建立軟刪除欄位:
$table->softDeletes()
建出來的table結構如下,其實softDeletes()就是新增一個deleted_at的timestamp欄位。