質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

601閲覧

Laravelのmiglationで外部キー設定がしたい

taikishiino

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/07/08 18:08

編集2018/07/10 06:40

【環境】
Laravel5.6
MySQL5.7.22

Laravelのマイグレーションで以下のように外部キーを設定しました。
Profile_idの外部キーを追加して初めてエラーが出たので、外部キー制約周りがエラー対象だと思うのですが、詳しい原因がわかりません。

データベースの外部キー周りの知識がある方お力添えをお願いしたいです。

※ php artisan migrate:refresh --seedでマイグレーション実行しました。(既存テーブルをすべて削除してからも試しました)

【database/migrations】

php

1**2018_07_07_135039_create_profiles_table.php** 2 3public function up() 4 { 5 Schema::create('profiles', function (Blueprint $table) { 6 $table->increments('id'); 7 $table->string('name'); 8 $table->string('comment'); 9 $table->timestamps(); 10 }); 11 }

php

1**2018_07_08_135937_create_posts_table.php** 2 3public function up() 4 { 5 Schema::create('posts', function (Blueprint $table) { 6 $table->increments('id'); 7 $table->string('title'); 8 $table->text('body'); 9 $table->integer('profile_id')->unsigned(); 10 $table->foreign('profile_id') 11 ->references('id')->on('profiles') 12 ->onDelete('cascade'); 13 $table->timestamps(); 14 }); 15 }

【database/seeds】

php

1 2**ProfileTableSeeder.php** 3 4public function run() 5 { 6 // Fakerを使う 7 $faker = Faker\Factory::create('ja_JP'); 8 9 // ランダムに記事を作成 10 for ($i = 0; $i < 20; $i++) 11 { 12 DB::table('profiles')->insert([ 13 'name' => $faker->unique()->userName(), 14 'comment' => $faker->text(100), 15 'created_at' => $faker->dateTime(), 16 'updated_at' => $faker->dateTime(), 17 ]); 18 } 19 }

php

1 2**PostTableSeeder.php** 3 4public function run() 5 { 6 // Fakerを使う 7 $faker = Faker\Factory::create('ja_JP'); 8 9 // ランダムに記事を作成 10 for ($i = 0; $i < 20; $i++) 11 { 12 DB::table('posts')->insert([ 13 'title' => $faker->text(20), 14 'body' => $faker->text(200), 15 'profile_id' => $faker->numberBetween(1, 20), 16 'created_at' => $faker->dateTime(), 17 'updated_at' => $faker->dateTime(), 18 ]); 19 } 20 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

記載されているファイルを元にphp artisan migrate:refresh --seedを実行しましたが、正常に実行されました。

おそらくですが、DataBaseSeederでPostTableSeederを先にcallしてませんか?

子テーブルであるpostsのデータを先に生成しようとすると、
親テーブルであるprofilesのidが参照出来ずにエラーが発生します。

そのため、親テーブルであるprofilesのデータを先に生成してあげてください。

php

1<?php 2 3use Illuminate\Database\Seeder; 4 5class DatabaseSeeder extends Seeder 6{ 7 /** 8 * Seed the application's database. 9 * 10 * @return void 11 */ 12 public function run() 13 { 14 $this->call(ProfileTableSeeder::class); 15 $this->call(PostTableSeeder::class); 16 } 17}

投稿2018/07/21 05:38

編集2018/07/21 06:05
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taikishiino

2018/07/21 09:05

ご回答ありがとうございます。 言われた通り参照先の親テーブルを先に作るようにしたらできました。 Laravelのマイグレーションの仕様がよくわかりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問