LoginSignup
28
29

More than 3 years have passed since last update.

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

Last updated at Posted at 2018-09-13

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はたぶんコード関係はないと思う)標準化機構によって定められた規格ないかな~?って思考をもってコーディングしていきたいです。

28
29
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
29