Laravel 學習筆記 — CRUD (3)

ViNciHsu
5 min readOct 14, 2020

--

本篇主要了解,update 跟 delete

第一種作法:$b1 = Book::first()

首先讀出要修改的資料,確認要修改的欄位及其值

接著進行修改,接著 save() ,重新讀取剛才的資料,發現 available 欄位已從0 變成 1

修改欄位值儲存,重新讀出確認已修改成功

第二種作法:$b2 = Book::find(2)

使用 $b2->update([‘available’ => true]) 直接進行修改,這樣就不需要再用 save() 儲存

直接使用 update() 進行修改,且時間戳記也會更新

一次更新多筆也可以,找出 available 為 true 的集合資料後,直接接 update() 語法對其修改欄位值,可以看到修改了2 筆資料,修改後再查詢為 true 的資料已經沒有了,因為都改成 false 了

批次修改資料

接著試著刪除,先來創建一筆新資料用來練習刪除用

創建用來練習刪除的第3筆資料

第一種刪除方法,使用 delete()

$b3 = Book::find(3)

$b3->delete()

使用 delete() 進行刪除

第二種刪除方法,使用 destroy()

Book::destroy(4) 就直接刪除掉 id = 4 的這筆資料

使用 destroy() 進行刪除

另外,其實在很多實務上的操作,並不會真的去做刪除的動作,尤其是電商相關的網站,一旦資料刪除,很多資料會對不起來;因此會有所謂的假刪除或是軟刪除的動作

SoftDelete

  • deleted_at → null //會需要建立一個 deleted_at 的時間戳記,預設值為 null ,這樣之後看到此欄位有值,就表示該筆資料曾做過假刪除的動作

首先,php artisan make:migration add_deleted_at_to_books

  • 魔術語法:如果創建 migration 時,有出現一些 add / update /delete 相關的關鍵字,創建後的檔案會自動幫忙寫入一些內容
一般的 migration 創建後,up() 內應該是空的

$table->dateTime('deleted_at'); //自己建立假刪除的時間戳記

$table->softDelete(); //ORM 內建的假刪除時間戳記

up() 內要加的假刪除時間戳記
down() 內要砍掉假刪除用的時間戳記,所要加的語法

在 2020_10_14_074209_add_deleted_at_to_books.php 中的 up() 跟 down() 都加完語法後,執行 php artisan migrate ,再到 SQLite 資料庫查看資料表結構,就會發現多出 deleted_at 這個欄位

多出 deleted_at 這個欄位
多出 deleted_at 這個欄位

接下來,試著做"假刪除"的動作;要做此動作,需要到 Model 做一些操作,回到 Book.php 在 Book 的 class 中,加上 use SoftDeletes; (如果使用PHPStorm,會自動加上 use Illuminate\Database\Eloquent\SoftDeletes; 大部分人不曉得 SoftDeletes 這模組放在哪)

Model 中 Book.php 所需要家的內容

到目前為止就好了,在此處告訴 Book 這個 Model 請幫我使用軟刪除 SoftDeletes

接下來到 php artisan tinker 進行測試,對 id 為 1 的第一筆資料進行刪除

對 id 為 1 的第一筆資料進行刪除

接著查詢第一筆資料已變更為 id 為 2 的資料

接著查詢第一筆資料已變更為 id 為 2 的資料

但是到 SQLite 查詢,id 為1的資料,其實還在

id 為1的資料,其實還在

如果想找假刪除的那筆資料,可以透過 withTrashed() 方法來找,如果只用find() 來找的話,得到的結果會是 null

--

--

No responses yet