Laravel Migrations

更新於 發佈於 閱讀時間約 6 分鐘

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

raw-image
  • 可以理解成: up()就是要對資料庫做什麼操作,down()就是把up()做的事情還原。比如若up() method用來建立table: 新增欄位、index、unique、nullable等等設定,down() method則要用來刪除table。
  • 如果再執行一次 $ php artisan make:migration create_user_table,會show已存在的error:
raw-image

接著寫好up, down程式邏輯:

raw-image

執行所有migrate:

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


若只想migrate某個檔案,可以指定檔案路徑:

$ php artisan migrate --path=/database/migrations/xxx.php

接著從DB中就可以看到user表建立了:

raw-image

也會在DB中自動建立一張migrations表,把這次執行migrate的紀錄寫上去:

raw-image
  • batch是執行順序的意思,如果有batch數字一樣的情況,表示當時是一起做migrate的,若執行rollback也會一起。
  • 假設剛剛還有一個migrate是create_product_table,一起執行migrate的話,這邊就會有兩筆紀錄,batch都是1。

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

$ php artisan migrate:status
raw-image

接著試試rollback: 這個指令會還原上一次的migrate,以程式碼來看就是會刪除user table,原本migrations table上的那行紀錄也會被清除。

$ php artisan migrate:rollback
  • 這邊需特別注意,即使table中有資料,執行rollback一樣會把整張table砍掉。

執行rollback後,從status上來看,會恢復成未執行的狀態:

raw-image

然後再建立一個migrate,for新增產品表格:

$ php artisan make:migration create_product_table
raw-image

接著執行migrate,如上述,會執行所有尚未執行migrate檔案的up(),會把user跟product表都依序建立起來:

$ php artisan migrate

由於user表結構剛剛看過了,這邊只show product:

raw-image
raw-image

再試試看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中移除。



本筆記參考:
1. https://ithelp.ithome.com.tw/articles/10243718
2. https://ithelp.ithome.com.tw/articles/10220189


留言
avatar-img
留言分享你的想法!
avatar-img
Vic Lin的沙龍
20會員
161內容數
Vic Lin的沙龍的其他內容
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/08/13
父元件 傳遞方法使用@ <template>    ...    <Login @modalClose="modalClose"/> ... </template> <script setup>     const _modal = ref();     function m
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/25
前情提要 由於我的筆電已經用了10年,無法再戰下去了,且有預算考量,加上使用電腦幾乎都是定點,只有偶爾回家的時候會需要攜帶,因此最終選擇了迷你電腦,體積小不占空間,又方便攜帶,剛好符合我的需求。 菜單 由於這台無法裝獨顯,所以CPU的部分選擇 AMD R5 3400G(含Vega 11內
Thumbnail
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
2023/03/10
Nuxt3中可使用useFetch來獲取數據,不須再引用axios,相當方便: 本筆記參考: https://juejin.cn/post/7104071421160063012 https://juejin.cn/post/7086472647575339045
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
Thumbnail
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。 系統背景 資料庫的設計方式,目前常見會有兩種方向,code first 以及 database
Thumbnail
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除
Thumbnail
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除
Thumbnail
S1.建立資料庫 user S2.建立 index.htm a.載入 vue.js、jquery、bootstrap b.版面建立 S3.vue.js程式 新增、查看列表、互動視窗、修改、刪除 index.htm VueControl.js 原碼:https://reurl.cc/e3k8yL
Thumbnail
S1.建立資料庫 user S2.建立 index.htm a.載入 vue.js、jquery、bootstrap b.版面建立 S3.vue.js程式 新增、查看列表、互動視窗、修改、刪除 index.htm VueControl.js 原碼:https://reurl.cc/e3k8yL
Thumbnail
Laravel Notifications(通知),是用來通知使用者應用程式訊息的功能,比如付款完成發送email或簡訊通知使用者,文章被訂閱通知等等。Notifications甚至還可以把通知訊息塞進DB,可以用來顯示在後台報表頁面中。 以下以發送email通知來舉例用法。 建立通知 發送通知
Thumbnail
Laravel Notifications(通知),是用來通知使用者應用程式訊息的功能,比如付款完成發送email或簡訊通知使用者,文章被訂閱通知等等。Notifications甚至還可以把通知訊息塞進DB,可以用來顯示在後台報表頁面中。 以下以發送email通知來舉例用法。 建立通知 發送通知
Thumbnail
當伺服器需要處理一些比較花時間的任務時(如發送Email、上傳影片等等),讓user等待直到執行完畢,是個很不明智的選擇,這時候就很適合使用Queue,讓工作在背景執行,使用者就能立刻做下一件事,不必在那邊等待。 .env: QUEUE_CONNECTION預設是sync 改成database:
Thumbnail
當伺服器需要處理一些比較花時間的任務時(如發送Email、上傳影片等等),讓user等待直到執行完畢,是個很不明智的選擇,這時候就很適合使用Queue,讓工作在背景執行,使用者就能立刻做下一件事,不必在那邊等待。 .env: QUEUE_CONNECTION預設是sync 改成database:
Thumbnail
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
Thumbnail
如上篇,使用Migration來做DB版本控制,但是會發現開發過程中若是要建立測試資料,要進DB一筆一筆手動新增或執行預先寫好的insert sql,其實有點麻煩,使用Laravel提供的Seeder功能,就可以解決這個問題。 指令如下,假設建立一個user table seeder:
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News