プログラムの仕様変更が起こった
ユーザのこの入力項目、必須のつもりだったけど、やっぱり必須じゃないように!
という要件がやってきました。
DB側では、必須と想定して、nullableにしていなかったみたいです。
$table->tinyInteger('xxx')
なるほど、では変更してみよう
changeが出来ない?
$table->tinyInteger('xxx')->nullable()->change()
さあ実行。
Unknown column type "tinyinteger" requested.
え、どういうことなの。
tinyIntegerにchange出来ない
1点先に訂正すると、tinyInteger『が』変更出来ないではなく、tinyInteger『に』変更できないです。
ということで、Laravel公式ドキュメント
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ではこう言いかえられてます。
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^)\