「DB定義を見ながらLaravelのmigrationコードを書くのが面倒くさい!」「定義から簡単にコードが作れたらいいのに!」ということで、かなり昔に検索したらGoogle sheet上で作成したDB定義書からmigrationコードを表示してくれる式を書いてくれている記事を見つけました↓
以来、改良しながらありがたく使わせてもらっています。
個人的には結構便利で気に入っているので私が変更を加えたものを共有したいと思います。
Google Sheet上の構造
テーブルカラムの構成は以下の画像のように"Name, Type, Length, Key/Index, Default, Allow null, Values, Note"の順番になっています。最後の2つは式には影響しないので無くても構いません。
どの種類のタイプに対応しているかは式の内容を見てもらえれば。
Laravel migrationコード表示式
で、I行に以下の式(以下の式は3行目のものです)を貼り付ければ上記の画像のようにI行に式が表示されます。あとはドラッグアンドドロップで式を下の行に複製していけば一気にMigrationコードが作成されます。
=IF($A3="created_at", "$table->datetime('created_at')->nullable();",
IF($A3="updated_at", "$table->datetime('updated_at')->nullable();",
IF($A3="deleted_atnotused", "$table->softDeletes();",
IF($A3="id", "$table->id();",
IF($A3="remember_token", "$table->rememberToken();",
IF($B3="double", "$table->double('" & $A3 & "', " & $C3 & ", " & #REF! & ")" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="float", "$table->float('" & $A3 & "', " & $C3 & ", " & #REF! & ")" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="int", "$table->integer('" & $A3 & "')" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", "") & IF($D3="index", "->index()", ""),
IF($B3="tinyint", "$table->tinyInteger('" & $A3 & "')" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="smallint", "$table->smallInteger('" & $A3 & "')" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="bigint", "$table->bigInteger('" & $A3 & "')" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="long", "$table->bigInteger('" & $A3 & "')" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="boolean", "$table->boolean('" & $A3 & "')" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="datetime", "$table->dateTime('" & $A3 & "')" & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="mediumint", "$table->mediumInteger('" & $A3 & "')" & IF(ISNUMBER($E3), "->default(" & $E3 & ")", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="varchar", "$table->string('" & $A3 & "', " & $C3 & ")" & IF(ISTEXT($E3), "->default('" & $E3 & "')", "") & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="text", "$table->text('" & $A3 & "')" & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="date", "$table->date('" & $A3 & "')" & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="time", "$table->time('" & $A3 & "')" & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
IF($B3="timestamp", "$table->timestamp('" & $A3 & "')" & IF(OR(ISTEXT($F3), $F3=TRUE), "->nullable()", ""),
"// NO MATCH")))))))))))
& IF($D3="index", "->index()", "")
& IF($D3="unique", "->unique()", "")
))))
& ";")))))
主要なタイプしか網羅していませんので、必要に応じて変更してください。
あと、不具合があるかもしれませんので、もし修正箇所があれば指摘していただけると有り難いです。