iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

Table Plus 連線教學

到這一步建議先連線 table plus 進行觀察, table plus 是超好用資料庫圖形化工具,他的免費試限制是兩個視窗,第三個視窗會跳出付費解鎖,到時再關掉一個視窗即可開啟別的,也就是不介意麻煩一點的話是可以一直免費用下去的!

官方網站及下載:https://tableplus.com

安裝完開啟後,可以按右鍵 > New > Connection

https://ithelp.ithome.com.tw/upload/images/20230925/20162893IU6NZ2AjgW.png

我的mac 是使用 mariadb,所以我這邊選擇 mariadb,然後 create

https://ithelp.ithome.com.tw/upload/images/20230925/20162893BgkJIBLhGn.png

然後輸入資料庫名稱、使用者帳號及密碼,按下 Test

https://ithelp.ithome.com.tw/upload/images/20230925/20162893rYPP34ukVD.png

都顯示綠色的就可以點選 Connect 連線囉!


“migrations” table 與 artisan 指令

終於到了 migration 的重頭戲!

migrate 與 rollback

當第一次 migrate 時,會執行所有 migration 檔案,假設三個 migration 是分別建立三張 table

https://ithelp.ithome.com.tw/upload/images/20230925/20162893iQKrMvQ9Kq.png

  1. 在 migrate 後執行 php artisan migrate:rollback,會回復最新一梯次的migration執行。(這裡舉例結果會是 drop 三張 table,僅留下空白的 migrations table)
  2. 每一次執行 php artisan migrate:rollback —step=1 都是取消一個 migration 檔案的執行。
  3. 同理,如果php artisan migrate:rollback —step=2 就會取消二個 migration 檔案的執行。

Laravel 如何知道 rollback 最新「一梯次」是哪些檔案? batch 的概念

仔細看 Table Plus,執行 php artisan migrate 後,多了一張 migrations table

https://ithelp.ithome.com.tw/upload/images/20230925/20162893nOXV2i478z.png

migrations table 有一個 batch 欄位:

  • batch 就是 migration 文件的"批次"編號,預設起始值是 1。
  • 它用來確定 migration檔案 的執行順序。
  • 當你運行 php artisan migrate 時,Laravel 會按照 batch 編號的順序執行 migrate。
  • 可以將 migrations 按照需要的順序分組,以確保數據庫結構按照你的計劃升級。
  • 當你運行 php artisan migrate:rollback 時,Laravel 會 rollback 最後一個批次(batch)的 migration 檔案。

https://ithelp.ithome.com.tw/upload/images/20230925/20162893sAN3rIG9yK.png

當資料庫已有三張 table ,此時新增第四個 migrations 檔案,並執行 php artisan migrate 後, Table 4 會被建立,batch 值為 2,因為 Table 4 是第二梯次被執行 migrate 的檔案。

下面可以再比較一下 artisan 指令與 batch 的欄位值:

https://ithelp.ithome.com.tw/upload/images/20230925/20162893GDhmExBCN3.png

  • php artisan migrate, 建立三個 table, batch 值皆為 1

    https://ithelp.ithome.com.tw/upload/images/20230925/20162893RSTfdmjMDH.png

  • php artisan migrate:rollback —step=3 ,然後這三個 table 都被 rollback ,因此 migrations 無資料

    https://ithelp.ithome.com.tw/upload/images/20230925/20162893oOcwpX8BwN.png

  • php artisan migrate,第二次 migrate 重新建立三個 table,batch 值為 1 (因為沒有更小的梯次了)

    https://ithelp.ithome.com.tw/upload/images/20230925/20162893S2lLIg5zI0.png

  • php artisan migrate:rollback —step=2 ,然後又 rollback 兩個檔案,只剩 Table 1

    https://ithelp.ithome.com.tw/upload/images/20230925/20162893HbRyTYcZSq.png

  • **php artisan migrate,**再次 migrate,Table 2、Table 3 的 batch 值皆為 2

    https://ithelp.ithome.com.tw/upload/images/20230925/20162893wQ1vleyKtX.png

  • php artisan migrate:rollback,再次 rollback ,最新的梯次 ( batch = 2 ),被回復,migration 又只剩下 Table 1

    https://ithelp.ithome.com.tw/upload/images/20230925/20162893Gqq6xOOk2G.png


重要提醒!!!

每一次執行新的 migration 檔案時,都一定要 rollback 看看,沒有報錯再 migrate 回來唷!

因為 rollback 的同時,就是執行 migration 檔案內的 down() 動作,菜鳥很常 down() 動作沒寫、或是寫錯,一開始沒有發現,等到新增超多張表之後要再來 debug 就已經為時已晚啦!所以一定要在 migrate 時一併 rollback 看看檢查一下唷!


常碰到的錯誤情境

新增 table 欄位,但是 model 新增資料時那個欄位一直顯示錯誤

  1. 忘記執行 php artisan migrate 對資料表真正動手修改

  2. protected $fillable 忘記一起修改

    我自己經常耍笨遇到這個問題,通常情況會是欄位結構不是 nullable() ,必須要給他值,

    然後 model 檔案裡面 protected $fillable = []; 忘記加入這個新增的欄位

migration rollback 出現錯誤

migration 檔案分成 up()down() 兩個區塊,up()和down()務必要相對應,才不會造成後面許多報錯機會。例如

up():新增 users table|新增 A 欄位|修改 B 欄位為 nullable

down():刪除 users table|刪除 A 欄位|取消 B欄位為 nullable


補充文件看到的用法

感覺以後會用到XD

  • 週期性的刪除資料

    class Flight extends Model
    {
        use Prunable;
    
        public function prunable(): Builder
        {
            return static::where('created_at', '<=', now()->subMonth());
        }
    }
    

上一篇
Migration & Table Plus 工具 (1)
下一篇
專案筆記:Model & Seeder
系列文
Laravel 後端菜鳥可以知道的流程概念30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言