コンテンツにスキップ

Top

Laravel の migration を使って 既存のテーブルのカラムを追加する

sqlコマンドでalter table addすればいいのだけど、今まで php artisan migrate でやってきたのに急にカラムの追加だけsql直打ちはなんだかなぁ、と思ったので調べた。

alter table 用のmigrationファイルを作成

以下のコマンドで既存のテーブルを変更するためのmigrationを生成する。

php artisan make:migration add_カラム名_to_テーブル名 --table=テーブル名

マイグレーションファイル名は任意だがわかりやすいようにしておく。

んで、実行したら、/database/migrations配下に新しいマイグレーションファイルが出来上がっている。

migrationファイルの編集

作成できたマイグレーションファイルを開くと以下のような感じのがでてくるので、upとdownの中身を追記する。
具体的にはupにaddしたいcolumnを、downはcolumnを消すときの処理を追加する

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Addカラム名Toテーブル名 extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('テーブル名', function (Blueprint $table) {
            $table->integer('カラム名')->default(-1);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('テーブル名', function (Blueprint $table) {
            $table->dropColumn('カラム名');
        });
    }
}

カラムの追加

以下のコマンドでカラムが追加される。

php artisan migrate
一見、全マイグレーションファイルが実施されるように思われるが、未実施のマイグレーションしか実施されないので、今追加したこのマイグレーションファイルしか実施されない。

さらに言えば、もう一回このコマンドを実行しても何もおきない。

元に戻す

カラム追加したけど消したいな、という場合は、

php artisan migrate:rollback --step=1

とやればいい。最後から1個前の(ようはさっき実施したカラムの追加)がもとに戻される。

いくつかいろんな変更をした後で、この追加したカラムを削除、みたいなのはあんまやめたほうがいい。上から順番にcreateとかしとるわけで、整合性チェックとかもあるし、ずいぶん経ってからこのadd columnを取り消したい、とかだったら、カラムをdropするマイグレーションを新規に追加したほうが無難。(たかが1行追加、とかだからなんでそんな面倒なことを、と思うかもしれんが、結構な変更をする場合もあるので)

まぁごちゃごちゃ追加削除すんなってこと。

以上!