Laravel Eloquent SoftDeletes

更新於 2022/05/09閱讀時間約 3 分鐘
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欄位。
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
資料情境: 每個產品有多種顏色,每種顏色屬於一個產品(一對多)。 程式碼: Product Model: 本筆記參考: 1. https://stackoverflow.com/questions/40468976/inserting-with-relationships-in-laravel
安裝設置: 安裝完成後,專案目錄結構如下: 執行$ npm run dev 可直接透過http://localhost:3000進入首頁,對應到pages/index.js。 Prod記得每次要先build再start: Example: SSG: 透過外部api取得資料建立靜態頁面 結論:
Laravel Migrate可以用來做資料庫版本控制,對開發團隊來說,可以快速修改Schema,了解每個工程師做了什麼change,比如新增、修改哪些欄位、表格等等,是非常實用的功能。 在開始之前,須先建立好DB,並設定好.env中的DB連線config。 建立migrate指令:
假設資料情境是「每位員工可能屬於多個部門,每個部門可能包含多位員工」,這種多對多的關係。 資料情境: 程式碼: 在Model中使用belongsToMany建立多對多關係,employee_department則為中間關聯表的table name。 列出所有員工,帶上對應的部門資料: 完整程式碼:
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
在Laravel中除了用Validator來驗證資料,還可以用Form Request Validation,建立一個驗證class,在request進入controller之前,會先在這邊做驗證,若驗證失敗則不會繼續執行Controller。 建立form request: 範例程式碼:
資料情境: 每個產品有多種顏色,每種顏色屬於一個產品(一對多)。 程式碼: Product Model: 本筆記參考: 1. https://stackoverflow.com/questions/40468976/inserting-with-relationships-in-laravel
安裝設置: 安裝完成後,專案目錄結構如下: 執行$ npm run dev 可直接透過http://localhost:3000進入首頁,對應到pages/index.js。 Prod記得每次要先build再start: Example: SSG: 透過外部api取得資料建立靜態頁面 結論:
Laravel Migrate可以用來做資料庫版本控制,對開發團隊來說,可以快速修改Schema,了解每個工程師做了什麼change,比如新增、修改哪些欄位、表格等等,是非常實用的功能。 在開始之前,須先建立好DB,並設定好.env中的DB連線config。 建立migrate指令:
假設資料情境是「每位員工可能屬於多個部門,每個部門可能包含多位員工」,這種多對多的關係。 資料情境: 程式碼: 在Model中使用belongsToMany建立多對多關係,employee_department則為中間關聯表的table name。 列出所有員工,帶上對應的部門資料: 完整程式碼:
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科