laravel5.1のschema builderで外部キー(リレーションシップ)を作成する時の注意点
1, ストレージエンジンがMyISAM(外部キー非対応)ではダメ!
vi /etc/my.conf
1 2 3 4 5 6 7 8 9 |
[mysqld] character-set-server=utf8 collation-server = utf8_general_ci # ついでに照合順序も指定しておく skip-character-set-client-handshake #メモリ対策 #skip-innodb ←←←innodbを使えなくするようにするオプション? default-storage-engine=InnoDB # MyISAMから変更する table_definition_cache=200 |
2, 外部キー・参照キーのデータ型は合わせておく
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Schema::create('parent_table', function($table) { // $table->engine = 'InnoDB'; // テーブル単位でもストレージエンジン指定は出来る。 $table->increments('id'); $table->string('title')->nullable(); $table->string('body')->nullable(); $table->timestamps(); }); Schema::create('child_table', function($table) { // $table->engine = 'InnoDB'; // テーブル単位でもストレージエンジン指定は出来る。 $table->increments('id'); $table->integer('parent_id')->nullable()->unsigned(); //インクリメントの主キーは、unsigned型!! // 最初からuint型でもOK! // $table->unsignedInteger('parent_id'); $table->string('title')->nullable(); $table->string('body')->nullable(); $table->timestamps(); //文字列の外部キー参照元はindexが無いとダメ! $table->foreign('parent_id')->references('id')->on('parent_table'); }); // 文字列型でもリレーションシップ生成できるが、文字列の外部キー参照元はindexが無いとダメ! // 親テーブル $table->string('school_number', 7)->unique(); //->index();でもOK // 子テーブル $table->string('student_number', 7)->unique(); $table->foreign('student_number')->references('id')->on('school_number'); |
参照URL:
外部キーの作成がうまくいきません。なぜですか?
3, SQL実行(CREATE TABLE)の順番
php artisan migrateした場合、SQL実行の順番はlaravel_project/database/migrationsフォルダ以下にあるyyyy_mm_dd_hhmiss_create_xxxxx_table.phpの年次の古い順に実行される。
つまり、親テーブルを古い日時じゃないとダメ!
ex)
2015_12_15_123456_create_parent_table.php
2015_12_16_123456_create_child_table.php
ファイル名を直接修正しても大丈夫だが、Class CreateXXXXXtable not foundみたいなエラーが出る場合は、以下のコマンド実行で直った。
composer dump-autoload