メサイア・ワークス

laravelでのmigrate順について(リレーションを使う時の注意点)

laravelでのmigrate順について(リレーションを使う時の注意点)


1, laravelでは、CREATE TABLEを使わずにPHPで定義されたファイルを作成・実行して、MySQLにテーブルを作ります。

php artisan make:migration create_テーブル名s_table –create=テーブル名

2, コマンドを叩くと、PHPファイルが生成されます(ファイル名の頭に作成日時が付与される
YYYY_MM_DD_hhmiss_create_テーブル名s_table.php

3, 問題となるのは多対多のリレーションがある場合、中間テーブルを作成する場合です(1個のphpファイルで、複数のテーブル生成が出来ます)
MySQLに反映させるためには、以下のコマンドを実行します。
php artisan migrate
この時のCREATE TABLEされる実行順は、日付の古い順です。つまり、まだ生成されていないテーブルにリレーションを張ろうとするとエラーになります。

4, 解決方法としては、以下の通り。
その1、ファイル名を変更(YYYY_MM_DD_hhmiss)して、問題のない順番にする。
その2、2100_12_31_235959_create_relations_table.phpのように、最後に実行されるファイルを用意して、そこに中間テーブルを生成する
2の方が順番を気にしなくても良いのでオススメです。中間テーブル以外のリレーション(一対多)は、気にしないとダメです。

また、削除する時は逆の順番で削除されるのでエラーは出ません。
php artisan migrate:rollbak # ひとつ前の状態に戻す
php artisan migrate:reset # 全テーブル削除

注意!
2100_12_31_235959_create_relations_table.phpのようなファイルをartisanを使わずに、エディタから勝手に作ると
[Symfony\Component\Debug\Exception\FatalErrorException]
Class ‘CreateRelationsTable’ not found
みたいなエラーになるので、以下のコマンドでクラスを作ってもらう事!
php artisan optimize

モバイルバージョンを終了