Laravelでデータベースのテーブルカラムを後から追加したい【第4回マッヒーの勉強部屋】

こんにちは、新人エンジニアのマッヒーです。弊社インスパイアデザインでは月に1回勉強会が実施されており、社長のマーチンさん、ベテランエンジニアのトミーさんのご指導のもと日々勉強させていただいております。

現在私が取り組んでいる課題は、「PHPフレームワークのLaravelを用いてWordPressと同じようなCMSを構築する」というものです。
そこで毎月の勉強会でCMS開発の進捗・成果方向を行っており、その都度トミーさんからアドバイスや次回の課題をいただいています。

つい先日行われた勉強会では、記事とカテゴリー、タグの紐付け機能の実装を行い成果報告をさせていただきました。そこでトミーさんからこのようなアドバイスをいただきました。

トミーさん

1対1の関係のリレーションテーブル基本的には避けるべきです。
テーブルを分けた分だけ参照するテーブルの数が増えてしまうことになるので、ページの読み込み速度を低下させる要因にもなります。
今回のように分ける必要がない場合は1つのテーブルにまとめてしまうのがベストです!

ご指摘頂いた実際のテーブルは以下の記事とカテゴリーの関連付けを行うための relations_categories テーブルです。

記事とカテゴリーの関連付けは1つまで、記事とタグの関連付けは複数可というルールになっています。
なので、entries と relation_categories の関係は1対1となっています。
であれば、entries テーブルに category_id というカラムを設置してしまえば relation_categories テーブルは不要になりますよね。

ということで早速データベースをを再度設計してみました。

おお! relation_categories テーブルが無くなったのでかなりスッキリしました。

では実際にLaravelの方でもデータベースを修正していきたいと思ったのですが、
こんな疑問が生まれました。

minegisi
マッヒー(自分)

entries テーブルに category_id カラムを追加するとなると、entries テーブルを一旦削除して、再度作り直す必要がありそうだな。
でも既存の記事も全て消えてしまうし、どうすれば。。
後からカラムを追加する方法はないのかな?調べてみよう。

調べてみたところなんと、Laravelでは、カラムを後から追加することができるみたいです。

minegisi
マッヒー(自分)

さすがLaravel。。

では実際に作業を行います。

以下のコマンドを実行して、–table オプションにテーブル名を指定したマイグレーションを作成します。

$ php artisan make:migration add_category_id_to_entries --table=entries

作成されたマイグレーションファイルの up メソッドに追加するカラムを指定します。

    public function up()
    {
        Schema::table('entries', function (Blueprint $table) {
            // category_idカラムを追加
            $table->integer('category_id')->nullable();
        });
    }

そして、最後に以下のコマンドでマイグレーションを実行するだけで良いみたいです。

$ php artisan migrate

実際にカラムが追加されたかを確認してみたとろこ、以下の以下のようにきちんとカラムが追加されていました。

この記事を書いた人

峯岸真弘