【Lalavel】マイグレーションファイルまとめ

こんにちは!ドイです!!

先日、初めてDB設計をやったのですが、
後からどんどん出てくる型の間違えや、カラム追加…
マイグレーションファイルを使って修正しましたので、まとめていきたいと思います。

テーブル作成

upに作成するテーブルについて、
downはロールバックする際の処理を書きます。

<?php

public function up()
    {
        Schema::create('reserves', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name')->comment('名前');
            $table->string('cat_name')->comment('猫の名前');
            $table->mediumText('purpose')->comment('目的');
            $table->TinyInteger('car_number')->comment('車の台数');
            $table->rememberToken();
            $table->timestamps();

            $table->softDeletes();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('reserves');
    }

カラム追加

「after」を使って、どのカラムの後ろにカラムを追加するのか指定できます。

<?php
public function up()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->string('addres')->after('name')->comment('住所');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->dropColumn('addres');
        });
    }

カラム名変更

おっと、「address」の綴りが違うようです。
修正したいと思います。 upでは

<?php
$table->renameColumn('修正するカラム名' , '修正後のカラム名');

downでは

<?php
$table->renameColumn('修正後のカラム名' , '修正前のカラム名');

と記述します。

<?php
public function up()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->renameColumn('addres' , 'address');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->renameColumn('address' , 'addres');
        });
    }

カラム削除

reservesテーブルに「cat_name」は不要だったようです。
こちら削除します。

<?php
public function up()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->dropColumn('cat_name');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->string('cat_name');
        });
    }

カラムの型変更

mediumTextからstringに変更

<?php
public function up()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->string('purpose')->comment('目的')->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserves', function (Blueprint $table) {
            $table->mediumText('purpose')->comment('目的')->change();
        });
    }

カラムのNULL制約を変更

こちらが厄介でした。
というのも、laravelではchangeメソッドで変更できる型に制約があるからです。

以降のカラムタイプのみ変更可能です:bigInteger、binary、boolean、date、dateTime、dateTimeTz、decimal、integer、json、longText、mediumText、smallInteger、string、text、time、unsignedBigInteger、unsignedInteger and unsignedSmallInteger

ALTER TABLEで修正していきたいと思います。

<?php
public function up()
    {
        Schema::table('reserves', function (Blueprint $table) {
            DB::statement('ALTER TABLE `reserves` MODIFY `car_number` TINYINT DEFAULT NULL;');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('reserves', function (Blueprint $table) {
            DB::statement('ALTER TABLE `reserves` MODIFY `car_number` TINYINT NOT NULL;');
        });
    }

まとめ

一人で開発、もしくは案件が始まったばかりでは、
テーブルを作り直してしまった方が早い場合もあります。
今回は、テーブル削除できず、修正に修正を重ねる必要があったため大変でした。
もちろん修正できるに越したことはありませんが、仕様を固める段階で、
漏れのないDB設計書を作っていけたらなと思います。