エンジニアのひよこ_level10

毎日更新してた人。たまに記事書きます。

【Laravel】migration作成時に、tinyInteger等一部change出来ない罠【599日目】

プログラムの仕様変更が起こった

ユーザのこの入力項目、必須のつもりだったけど、やっぱり必須じゃないように!

という要件がやってきました。
DB側では、必須と想定して、nullableにしていなかったみたいです。

$table->tinyInteger('xxx')

なるほど、では変更してみよう

changeが出来ない?

$table->tinyInteger('xxx')->nullable()->change()

さあ実行。

Unknown column type "tinyinteger" requested. 

え、どういうことなの。

tinyIntegerにchange出来ない

1点先に訂正すると、tinyInteger『が』変更出来ないではなく、tinyInteger『に』変更できないです。

ということで、Laravel公式ドキュメント

laravel.com

The following column types can not be “changed”: char, double, enum, mediumInteger, timestamp, tinyInteger, ipAddress, json, jsonb, macAddress, mediumIncrements, morphs, nullableMorphs, nullableTimestamps, softDeletes, timeTz, timestampTz, timestamps, timestampsTz, unsignedMediumInteger, unsignedTinyInteger, uuid.

非対応・・・!

現在の最新であるLaravel 5.8ではこう言いかえられてます。

laravel.com

Only the following column types can be “changed”: bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger and unsignedSmallInteger.

どちらにしろ、tinyIntegerはchangeに対応されてないですね。

なぜ?

up downなどで、ロールバック可能な変更にしか対応していないから。

あるいは、MySQLにはあるけど、PostgreSQLには無い型など。

互換性に対しての観点からこういう仕様っぽいです。

なお、生SQLを書けば動くには動くのですが、
そのSQL次第ですが、MySQLでしか動かないような書き方をしちゃったりしがちなので注意。

そういうときは、『このアプリはMySQL以外では動かさないという強い意志』を持って書く必要があります/(^o^)\