Laravel, PHP

修改Laravel中資料表的欄位型態

在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時就不會發生錯誤了。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s