Laravel Migrations

更新於 2022/05/03閱讀時間約 5 分鐘
Laravel Migrate可以用來做資料庫版本控制,對開發團隊來說,可以快速修改Schema,了解每個工程師做了什麼change,比如新增、修改哪些欄位、表格等等,是非常實用的功能。
在開始之前,須先建立好DB,並設定好.env中的DB連線config。

建立migrate指令:
$ php artisan make:migration {name}
比如建立一個migrate 目的是要建立user table:
$ php artisan make:migration create_user_table
database/migrations下會產生如下圖的檔案: prefix會自動加上建立datetime
  • 可以理解成: up()就是要對資料庫做什麼操作,down()就是把up()做的事情還原。比如若up() method用來建立table: 新增欄位、index、unique、nullable等等設定,down() method則要用來刪除table。
  • 如果再執行一次 $ php artisan make:migration create_user_table,會show已存在的error:
接著寫好up, down程式邏輯:

執行所有migrate:
$ php artisan migrate
  • 這個指令會執行所有尚未migrate的檔案中的up() method,會依建立時間順序執行。

若只想migrate某個檔案,可以指定檔案路徑:
$ php artisan migrate --path=/database/migrations/xxx.php
接著從DB中就可以看到user表建立了:
也會在DB中自動建立一張migrations表,把這次執行migrate的紀錄寫上去:
  • batch是執行順序的意思,如果有batch數字一樣的情況,表示當時是一起做migrate的,若執行rollback也會一起。
  • 假設剛剛還有一個migrate是create_product_table,一起執行migrate的話,這邊就會有兩筆紀錄,batch都是1。

有時候執行migrate會發現出現這個訊息: Nothing to migrate.
這表示已經所有migrate都有執行過了,可以查詢一下migrate狀態:
$ php artisan migrate:status

接著試試rollback: 這個指令會還原上一次的migrate,以程式碼來看就是會刪除user table,原本migrations table上的那行紀錄也會被清除。
$ php artisan migrate:rollback
  • 這邊需特別注意,即使table中有資料,執行rollback一樣會把整張table砍掉。
執行rollback後,從status上來看,會恢復成未執行的狀態:

然後再建立一個migrate,for新增產品表格:
$ php artisan make:migration create_product_table
接著執行migrate,如上述,會執行所有尚未執行migrate檔案的up(),會把user跟product表都依序建立起來:
$ php artisan migrate
由於user表結構剛剛看過了,這邊只show product:
再試試看rollback:
$ php artisan migrate:rollback
如上述,rollback會還原上一次的migrate,也就是會執行create_user_table和create_product_table的down() method,所以這時候會發現user跟product表都不見了。

先rollback所有migrate(從時間最新到最舊依序還原),再重新執行所有migrate(從最舊到最新): 也就是執行所有migrate的down method,再執行所有migrate的up method。
$ php artisan migrate:refresh

rollback所有migrate(從最新到最舊): 也就是執行所有migrate的down method。
$ php artisan migrate:reset

以上介紹了migrate的用法,對一個新加入團隊的發開者來說,一個指令就能夠馬上建置完整的local DB環境,真的是非常強大啊!
不難發現,其實Laravel是透過migrations這張表來記錄migrate狀態的,下migrate指令的時候會比對判斷table中的migration名稱,多出來的migrate檔案就是新的,要trigger up() method,並insert記錄。下rollback指令的時候,會抓table中batch數字最大的去trigger該組的down() method,然後把這組batch的data row從table中移除。
為什麼會看到廣告
avatar-img
21會員
161內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Vic Lin的沙龍 的其他內容
假設資料情境是「每位員工可能屬於多個部門,每個部門可能包含多位員工」,這種多對多的關係。 資料情境: 程式碼: 在Model中使用belongsToMany建立多對多關係,employee_department則為中間關聯表的table name。 列出所有員工,帶上對應的部門資料: 完整程式碼:
本篇主要是要探討,with/has/whereHas/doesntHave/whereDoesntHave之間的差別,以部落格文章及留言的例子來看。 資料情境: 程式碼與結果: with是把所有文章跟留言都找出來。 has是把所有有留言的文章找出來,不包含留言。
之前在執行某些專案的時候,常看到->with()這種寫法,因此一直都很好奇到底跟->join()寫法有什麼差別,哪一種寫法效能比較好呢? 資料情境: 假設現在情境是要撈出文章跟留言,目前共有2篇文章,每篇各有4萬筆留言,也就是留言table共有8萬筆資料: 程式碼: 實驗結果: 結論:
本筆記會以簡單的例子說明,如何在Laravel中進行unit test 與 feature test。 phpunit.xml則是設定檔,可以設定哪些檔案要做測試,哪些要排除在外等等。 使用命令建立新的test case: 建立feature test: 建立unit test: 執行測試:
對於使用Laravel來講,可以直接用composer來安裝predis,可以說是相當方便: config/database.php: redis預設有16個資料庫,這邊是各個資料庫的連接設定。 要使用predis,要記得把env file中的REDIS_CLIENT改成predis。 .env:
Redis主要是運行在Linux系統環境中的,官方下載區找不到windows安裝程式,不過微軟有維護windows版本的,可以到github release page下載安裝。 直接下載msi來安裝: 測試是否安裝成功: 回傳PONG表示服務正常。 查看版本資訊: 列出所有key:
假設資料情境是「每位員工可能屬於多個部門,每個部門可能包含多位員工」,這種多對多的關係。 資料情境: 程式碼: 在Model中使用belongsToMany建立多對多關係,employee_department則為中間關聯表的table name。 列出所有員工,帶上對應的部門資料: 完整程式碼:
本篇主要是要探討,with/has/whereHas/doesntHave/whereDoesntHave之間的差別,以部落格文章及留言的例子來看。 資料情境: 程式碼與結果: with是把所有文章跟留言都找出來。 has是把所有有留言的文章找出來,不包含留言。
之前在執行某些專案的時候,常看到->with()這種寫法,因此一直都很好奇到底跟->join()寫法有什麼差別,哪一種寫法效能比較好呢? 資料情境: 假設現在情境是要撈出文章跟留言,目前共有2篇文章,每篇各有4萬筆留言,也就是留言table共有8萬筆資料: 程式碼: 實驗結果: 結論:
本筆記會以簡單的例子說明,如何在Laravel中進行unit test 與 feature test。 phpunit.xml則是設定檔,可以設定哪些檔案要做測試,哪些要排除在外等等。 使用命令建立新的test case: 建立feature test: 建立unit test: 執行測試:
對於使用Laravel來講,可以直接用composer來安裝predis,可以說是相當方便: config/database.php: redis預設有16個資料庫,這邊是各個資料庫的連接設定。 要使用predis,要記得把env file中的REDIS_CLIENT改成predis。 .env:
Redis主要是運行在Linux系統環境中的,官方下載區找不到windows安裝程式,不過微軟有維護windows版本的,可以到github release page下載安裝。 直接下載msi來安裝: 測試是否安裝成功: 回傳PONG表示服務正常。 查看版本資訊: 列出所有key:
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
之前筆者收到了 Google 寄來的信件,內容重點在於 July 29, 2019 之後就不再支援原本的 Library com.google.android.gms:play-services-places 。 所以就只好來研究新的 Library,官方提供兩個方案,一個是直接用新 Library
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
之前筆者收到了 Google 寄來的信件,內容重點在於 July 29, 2019 之後就不再支援原本的 Library com.google.android.gms:play-services-places 。 所以就只好來研究新的 Library,官方提供兩個方案,一個是直接用新 Library