在Laravel框架中,如果要新增一張資料表,我們會建立一個Model,並讓它產生一個migrations檔案,指令如下:
php artisan make:model MyTable --migration
執行完上面的指令之後,系統會在你的App\Http\Models資料夾之下產生一個MyTable.php的檔案,同時也會在database\migrations的資料夾之下產生一個類似以下這樣的資料庫遷移檔案:
2020_11_04_23445_create_my_tables_table.php
在上面這個遷移檔案中,其預設的內容如下:
class CreateMyTablesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('my_tables', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('my_tables');
}
}
其中up()函式就是負責在執行php artisan migrate指令時進行資料表的建立作業,而down()則是在執行php artisan migrate:rollback時要進行的復原作業。
在建立了遷移表之後,通常我們都還會在up()函式中添加我們想要的資料表欄位,之後在執行migrate之後,就可以得到我䦏想要的資料表了。
但是,當在建立了資料庫,而且也在資料表中建立資料之後,忽然需要調整欄位的名稱或是型態又臠如何呢?除了把原有的資庫表刪rollback再修改所需要的型態重新執行migrate之外,也可以再建立一個專門用來修正欄位型態的migration檔案,指令如下:
php artisan make:migration change_poem_model_field_type
上述的指令會再建立一個遷移檔案,此時我們就可以開啟該檔案把其中的up函式和down函式進行如下的修正:
public function up()
{
Schema::table('poem_models', function(Blueprint $table) {
$table->integer('author')->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('poem_models', function(Blueprint $table) {
$table->string('author')->change();
});
}
如你所看到的,在此例中我們把原有的作者欄位從string變成integer了。上述檔案編輯完畢之後,在開始執行migrate指令之前還要先確定以下所需要的模組是否已經安裝在系統中了:
composer require doctrine/dbal
之後,再執行以下的指令進行migrate即可:
php artisan migrate
值得注意的是,在修改欄位的型態時,如果你的資料表中已經有內容了,原有的內容和修改後的型態要能夠相符合或互相轉換,否則會產生錯誤。在上述的例子中,例如原來的author欄位中已有一筆資料是「李白」,則在轉換成整數型態時即會發生錯誤,此時,只要利用程式將「李白」這個字串資料先轉換成相對應的數值的字串(例如:’1’),再執行migrate時就不會發生錯誤了。