Edited at

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」一見「あー」と納得しやすい理屈ですが、どんな理屈であれ、こと性別コードに関しては国際レベルでの規格あるからそれを採用しましょう。