PHP
migration
laravel
laravel5
laravel5.4

Laravelでマイグレーションを使用する際にintegerのサイズの指定方法に注意

integerのサイズ指定で困ったことがあったため備忘録として残します。
結論だけ見たい人はクリックME

概要

laravelの便利機能の一つマイグレーション。
多くの人は新規開発の際、これを利用してDB構築をする人が多いと思います。

その際、カラムで指定した型の長さを明示的に指定する場合もあります。
(サーバの記憶領域が多きくなった昨今、意味もなく長さ指定するのは逆にNG)

特にでコード値を保存しますよーってパターンはほぼ必ずあると思います。
例えば、都道府県マスタを作成する際、皆さんほぼほぼJIS X0401 をベースにテーブル定義をすると思います。

    //prefsマイグレーション 
    public function up()
    {
        Schema::create('prefs', function (Blueprint $table) {
                // JIS X0401に準拠して01~47が入るためstring(verchar(2))で定義
            $table->string('pref_code',2)->unique()->comment('都道府県コード');
            $table->string('pref_name')->comment('都道府県名');
        });
    }

ミニマムですが、基本的に上記のような書き方になると思います。

では、今度は性別マスタを例にあげてみます。(実際はこんなマスタはACCESS以外作らないと思う)
性別も一応ISOが定めているため、ISO 5218 をベースに定義してみましょう。
image.png

コードは0、1、2、9の整数を使用するので今度は整数型で定義しましょう。

    //sexマイグレーション 
    public function up()
    {
        Schema::create('sex', function (Blueprint $table) {
                // ISO 5218
            $table->integer('sex_code')->length(1)->unique()->comment('性別コード');
            $table->string('sex_name')->comment('名称');
        });
    }

はい。たぶんミニマムだとこんな感じになると思います。

では、最後に少数を扱うカラム の場合どうなるのか?
面倒なので、テーブルは適当。

    //hogeマイグレーション 
    public function up()
    {
        Schema::create('hoge', function (Blueprint $table) {
                // 総桁8の小数点以下2桁以内
                $table->float('column1', 8, 2);
                // 総桁15の小数点以下8桁
                $table->double('column2', 15, 8);
                // 総桁5の小数点以下2桁
                $table->decimal('column3', 5, 2);
        });
    }

こういう感じなります。

【結論】

はい。感のいい方は気が付いていると思いますが、
integerはサイズを指定するときlength(N)でチェーンしなきゃあかん。
こいつ以外のやつはご紹介した通り、第2引数以降でサイズの指定をしているのになんでだよ。

Laravelがそうしろっていうんだから仕方ない。
はい。

ということで、長くなりましたが、間違ってもintegerの第二引数にサイズを指定しないようにしましょう。
間違った場合どうなるのって?
早い話が、主キー扱いになってphp artisan migrateコマンドたたいた時に「なんで?なんで?エラーなんで??」ってなります。
まぁ、一緒に実行されたクエリも帰ってきますが、そのクエリを見るとおかしいのはわかりますが、サイズの指定方法が間違っているとマイグレーションファイルのどこの記述がおかしいのって?なります。

こんなことに1時間費やした。

以上です。

余談だけど、〇〇コードを使うってなったらDBだろうが何だろうがJISとかISOとかIEEEだろうが(IEEEはたぶんコード関係はないと思う)標準化機構によって定められた規格ないかな~?って思考をもってコーディングしましょう。
性別コードとかも「男はち〇こあるから1、女はないから0」一見「あー」と納得しやすい理屈ですが、どんな理屈であれ、こと性別コードに関しては国際レベルでの規格あるからそれを採用しましょう。