接下來我們會來認識一下 ThinkPHP 一些常用的基礎指令,但是這一篇最主要是介紹 migration 的部分,因為會影響後面的章節操作。
基本上我們開發最常用的指令會是 php think run,這個指令主要就是開啟本地端伺服器,可以方便我們開發 & Debug,但是其實 ThinkPHP 提供的指令不只有這個。
ThinkPHP 指令的格式不外乎都是這樣的模式:
php think [指令名稱]
php think version

php think -V

這邊要注意 -V ≠ version 這是兩種不同的東西
php think run
這個就不用多作介紹了,前面章節非常常使用,當你執行後就會開啟一個本地端伺服器。
php think clear
clear 會清除 runtime 資料夾內所有檔案。
php think make:controller [路徑]
這個指令後面只要帶上路徑,就可以自動生成了,例如 message/index,它就會建立一個 message 資料夾,然後底下有 controller/index.php。
php think make:MODEL [路徑]
與建立 Controller 的狀況是一樣的。
php think route:list
執行後你可以看到所有已經註冊的路由 ↓

php think

接下來這邊會稍微介紹一下 ThinkPHP 中其中一個擴展包,也就是 think-migration,think-migration 主要是幫助我們轉移資料庫,但是如果要使用的話,必須先透過 composer 安裝,那為什麼會特別講到 think-migration 呢?最主要是以往我們轉移資料庫時,大多都是使用 SQL 檔來轉移 ↓

但是對於 think-migration 不用太過於害怕,因為 think-migration 就是資料庫,一般來講我們對於資料庫是沒有辦法使用 SQL 來做版本控制,所以 think-migration 是會加入 Git 版本控制的,而且如果今天需求如果從 MySQL 轉到別的資料庫也不用太擔心,通常只需要微調一下就可以哩,那麼就先讓我們來安裝 think-migration 吧:
composer require topthink/think-migration=2.0.*

注意接下來操作請務必設定好 database.php,否則會無法操作,接下來我們可以使用 php think 來看看 think-migration 有哪些指令 ↓

接下來我們要將我們的資料庫做遷移的動作,基本上我們有六張資料表,分別為 hw_table、think_account、think_db、think_message、think_new_user、think_user,但是這邊要注意一件事情,我們在建立遷移資料表的時候,必須首字大寫,並採用駝峰制,拿 hw_table 做舉例,那指令就會是:
php think migrate:create HwTable
所以由此可知我們六張資料表的建立遷移的指令如下:
php think migrate:create HwTable
php think migrate:create ThinkAccount
php think migrate:create ThinkDb
php think migrate:create ThinkMessage
php think migrate:create ThinkNewUser
php think migrate:create ThinkUser
所以我們會有這幾張遷移檔案 ↓

建立完成後可以輸入 php think migrate:status 來看間一資料檔案狀況如何 ↓

另外如果你是參照本篇操作也是使用 XAMPP 的話,應該會出現以下錯誤:
[InvalidArgumentException]
There was a problem creating the schema table: SQLSTATE[42000]: Syntax error or acce
ss violation: 1067 Invalid default value for 'end_time'
這個問題你只需要打開 my.ini 進入設定檔 ↓

接下來搜尋 sql_mode,將原本的 sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION 修改成 sql_mode= 然後重啟即可解決~

剛剛建立的 migration 預設內容非常空虛,你只會看到裡面只有 change() ↓

接下來刪除 change(),改寫 up() 以及 down(),up() 會在我們執行 php think migrate:run 跑該內容而 down() 則是 migrate:rollback,那內容該怎麼寫呢?我們最主要會使用的語法有以下
addColumn()
dropTable()
create()
那這邊我拿留言版的資料表來作範例撰寫:
public function up()
{
    $table = $this->table('message'); // 載入時會自動加上 Think_
    $table->addColumn('title', 'string', ['limit'=> 15, 'default'=>'', 'comment' => '標題'])
    ->addColumn('content', 'text', ['default'=>'', 'comment' => '留言內容'])
    ->addColumn('author', 'string', ['limit'=> 20, 'default'=>'', 'comment' => '作者'])
    ->addColumn('email', 'string', ['limit'=> 128, 'default'=>'', 'comment' => '信箱'])
    ->addColumn('create_time', 'timestamp', ['default'=>'CURRENT_TIMESTAMP', 'comment' => '建立時間'])
    ->addColumn('last_modify_time', 'timestamp', ['default'=>'CURRENT_TIMESTAMP','update' => 'CURRENT_TIMESTAMP', 'comment' => '更新時間'])
    ->create();
}
public function down()
{
    $this->dropTable('message');
}
基本上這樣子就可以開始做遷移的動作,這邊只是稍微介紹一下 topthink/think-migration 而已,本身 topthink/think-migration 的核心是使用 phinx,更詳細的介紹我會推薦看phinx 手冊會更詳細,如果想看中文版的也有中文 Phinx 手冊。
那我先將原本 database.php 中 database 欄位修改成 it_test 並建立這個資料庫,所以正常裡面會是空資料庫 ↓

接下來只需要執行 php think migrate:run ↓

那麼這樣子你就可以看到資料庫多了兩個資料表,也就是 think_migrations、think_message

其中 think_migrations 是用來記錄那些 migrations 已經執行過的紀錄而已。
這樣有沒有覺得超方便的呢~
另外最後我補充一下 think_migrations 支援的 Valid Column Types 連結:Valid Column Types
當我們轉職資料後都會有一些預設資料(又稱數據填充),所以就會使用 php think seed:create 建立資料表預設資料,首先讓我們先拿留言版的資料表來當範例,首先先輸入 php think seed:create Message,接下來就可以看到根目錄的 database 資料夾底下多了一個 seeds/Message.php ↓

接下來打開 seeds/Message.php,基本傳想方式是採用陣列撰寫,所以可以這樣寫 ↓
public function run()
{
    $data = [
        [
            'title'=>'留言板1',
            'content'=>'留言訊息123456789',
            'author'=>'admin',
            'email'=>'admin@gmail.com'
        ],
        [
            'title'=>'留言板2',
            'content'=>'留言訊息123456789',
            'author'=>'admin',
            'email'=>'admin@gmail.com'
        ],
        [
            'title'=>'留言板3',
            'content'=>'留言訊息123456789',
            'author'=>'admin',
            'email'=>'admin@gmail.com'
        ],
        [
            'title'=>'留言板4',
            'content'=>'留言訊息123456789',
            'author'=>'admin',
            'email'=>'admin@gmail.com'
        ],
        [
            'title'=>'留言板5',
            'content'=>'留言訊息123456789',
            'author'=>'admin',
            'email'=>'admin@gmail.com'
        ],
    ];
    $posts = $this->table('message');
    $posts->insert($data)->save();
}
這樣就可以執行 php think seed:run 執行完就可以看到資料被自動插入了~~

在撰寫 think_migrations 這一邊的時候其實花滿多時間的,因為 think_migrations 有些地方我並不清楚,所以對於資料型別該如何使用不懂,導致卡了一下...
那麼下一篇就是要來將我們撰寫的 ThinkPHP 部屬到 Heroku 啦~
本文同步發表於:https://hsiangfeng.github.io/php/20190930/81339708/