iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 21
4
Modern Web

Laravel從入門到放棄…………原生PHP (疑?系列 第 20

[Day 20] Laravel實作 - 資料庫設定及建立(五)

接下來就要實作Migration修改資料庫的動作,
在進行這個動作之前,
我們再檢查一次我們的資料庫連線,
首先帳號密碼要設對,
然後確認一下資料庫的名稱

DB_DATABASE=laravelironman

並且根據這個名稱建立一個空的資料庫,
編碼就設為utf8mb4_unicode_ci
資料庫的部分我是用HeidiSQL來操作的,
當然你要用自己習慣的軟體也可以,
接下來就可以進入今天的主題.

執行Migration檔案

我們可以透過artisan指令,執行php artisan migrate,建立所有的Migration,在執行完後會到看執行的結果會像這樣
php artisan migrate
https://ithelp.ithome.com.tw/upload/images/20191001/20105694SQzknrQIY9.png

執行完Migration後,可以在資料庫看到有users、merchandise、transaction及migration資料表被建立。
https://ithelp.ithome.com.tw/upload/images/20191001/20105694qCaWbImkI4.png

你會發現除了我們設計的資料表外,還有額外多了一個migrations資料表,這個資料表是Laravel用來管理現在Migration的版本狀況,其中的batch欄位指的是migration版本號,此欄位為整數且會持續的增加。
https://ithelp.ithome.com.tw/upload/images/20191001/20105694xZxrMdDjbJ.png

恢復上一版本的Migration檔案

當我們想要恢復本次的Migration異動時,可以使用php artisan migrate:rollback指令,恢復前次Migration版本的所有異動
php artisan migrate:rollback
https://ithelp.ithome.com.tw/upload/images/20191001/20105694GIvRtbileV.png

就發現資料表都不見了,只剩下migrations資料表
https://ithelp.ithome.com.tw/upload/images/20191001/20105694NVhllTxSNE.png

清除所有的migration版本

當我們想要清除所有Migration資料庫版本時,可以使用php artisan migrate:reset重設所有的Migration版本,並清空所有資料。
php artisan migrate:reset
https://ithelp.ithome.com.tw/upload/images/20191001/20105694Y627KDWn8j.png

不但migrations資料表會被清空,所有的資料表也都會消失,不過我們看到畫面顯示Nothing to rollback,因為我們才剛做rollback的動作,現在的資料庫及migrations資料表已經是空的了。

重設所有的migration版本,重新建立所有的migration

當我們想要重設所有Migration資料庫版本,並立即重新建立所有Migration資料庫版本時,可以用php artisan migrate:refresh重設所有Migration版本並立即建立,此指令會清空所有資料,並重新建立所有資料表
php artisan migrate:refresh
https://ithelp.ithome.com.tw/upload/images/20191001/20105694QFozr3HFmP.png

如此一來會重新建立所有的資料表
https://ithelp.ithome.com.tw/upload/images/20191001/20105694CjHpne7Y3H.png

而migrations資料表的內容只會留下最新的
https://ithelp.ithome.com.tw/upload/images/20191001/20105694h24F3DORpp.png

Migration指令安全性

Migration的檔案一旦被執行,即使你去修改裡面的內容,也不會造成資料庫實際上的異動,唯一造成的效果就是讓接手的人想要問候你祖宗十八代(就是所謂的文件跟程式對不起來),解決的方式是透過新增migration檔案的方式處理,不要去異動到原來的檔案。

不過在剛開始開發產品的時候,有時候資料表有做小小的修改或異動,為了圖方便,常常會使用migrate:resetmigrate:refresh去清空測試環境中所有的資料,重建資料表。

但如果產品已經上線了,這些指令就會是一個非常危險的指令,對企業來說,產品最重要的資產就是資料,這個指令會導致所有的資料都被清除,所以請上線後小心謹慎去使用。

而當我們環境變數.env檔案中的APP_ENV設定為production(預設是local)時。在執行這些指令時,artisan會再次詢問我們是否確定真的要執行這個指令,當我們輸入yes確定要執行時,才會真的執行,這是Laravel針對這樣的情況所做的防呆設定,避免我們不小心誤打了會對產品造成傷害的指令。

資料庫的總結

透過這樣的資料庫設定方式,可以讓我們很快地對資料庫進行存取,並且可以透過.env檔案去控管我們的資料庫帳號密碼,因為.env檔案不在git版本控制中,所以該檔案不會在各個工程師的git資源庫中留存,而也是透過這樣的方式.env檔案中資料庫的連線帳號密碼才不會隨便的洩漏流出去,僅有正式環境的網站管理員才能存取到正式環境的.env檔案,也只有他們可以知道正式的資料庫帳號密碼是什麼,對於公司主機帳號密碼保存及安全性會提高許多。

而透過Migrations我們可以很方便的用程式碼的方式去管理資料表的版本,並透過程式碼可以很快地了解每個資料表欄位的定義及說明,以及知道所有資料表異動的歷史,這樣是不是很方便呢。但是Migration指令畢竟是直接對資料表做存取操作,會有資料安全性問題,所以在正式環境執行Migration時,要自己多加注意,不要不小心誤刪了產品中最重要的資料了。

在所有資料表都已經建立完成後,所有專案的起點都是會員,有了會員身分資料才可以建立商品及交易,接下來我們就從會員註冊的步驟,開始了解Laravel資料處理的邏輯,以及透過Query Builder或Eloquent ORM Model存取資料庫資料吧!

ps. 1
不過我在第一次測試的時候,
因為環境沒有處理好,
結果造成migration無法正常運作,
只好自己手動建立資料表,
為了考量到讀者也有可能發生這種情況,
明天我會把建表的指令貼上來,
方便讓大家即使無法使用migration指令也能繼續進行接下來的動作.

ps. 2
雖然鐵人賽只有30天的時間,
目前已經寫到20天感覺還在講前言的部分,
如果有人持續關注這一篇的話,
(謎之聲:其實並沒有人)
(沒有人:有我在關注喔!)
其實不用擔心,
我會將基本的功能整個完成才結束的,
目前預計大概會寫到40天吧,
請大家繼續支持呦~
啾咪~


上一篇
[Day 19] Laravel實作 - 資料庫設定及建立(四)
下一篇
[Day 21] Laravel實作 - 資料庫設定及建立(六)
系列文
Laravel從入門到放棄…………原生PHP (疑?47

2 則留言

0
暐翰
iT邦大師 1 級 ‧ 2019-10-02 00:51:29

有我在關注喔! /images/emoticon/emoticon12.gif

小魚 iT邦大師 1 級‧ 2019-10-02 08:36:09 檢舉

你有在學PHP嗎?
/images/emoticon/emoticon39.gif

暐翰 iT邦大師 1 級‧ 2019-10-02 11:40:37 檢舉

看你的文章了解基本php原理 XD

小魚 iT邦大師 1 級‧ 2019-10-02 13:30:44 檢舉

其實Laravel算是框架啦,
省了很多PHP的東西,
之前要寫香草的PHP要花很多時間做的事,
Laravel可以在很短的時間完成,
不過如果真的要學Laravel還是建議從香草的PHP學起比較好.

p.s.
不要問我香草是什麼,
有問題的話去問香草JS.

0
ckp6250
iT邦新手 2 級 ‧ 2019-12-13 16:49:04

  我覺得,對於大型專案的資料庫建置管理,Laravel 能做的應該還是很陽春,手動的部份比較多。

小魚 iT邦大師 1 級‧ 2019-12-14 08:53:58 檢舉

所以你有自動的方案?
有的話也很好啊,
工具本來就只是輔助,
重點還是看人怎麼用.

ckp6250 iT邦新手 2 級‧ 2019-12-14 10:55:47 檢舉

  資料庫在開發階段,最常發生的就是增減欄位或改變型態、預設值、索引、觸發、聯外、內儲程式,這些都不是 Migration 能掌握的,我們都會自己建立一套管理機制。

  Laravel 的強項應該是在後端及組織,migrate:reset或migrate:refresh 大約沒法應付大型資料庫結構。

  截長補短,才是最佳方案。

小魚 iT邦大師 1 級‧ 2019-12-14 11:01:40 檢舉

其實用Laravel也不一定要使用Migration,
只是建表比用原生寫的方便很多,
以及它提供了類似Git的記錄跟回復機制,
不用Migration還是可以使用Laravel.
(就像我一開始沒辦法用Migration還是直接建表了)

我要留言

立即登入留言