きっかけ
シーディングを行ったら、SQLのエラーが発生した。詳細は以下の通り。
作業手順
- Usersテーブルの
ID
カラムとTweetsテーブルのuser_id
カラムを関連づけるために、Tweetsテーブルのuser_id
カラムに外部キー制約を付ける。 - UsersテーブルとTweetsテーブルのシーディングを実行する。
(以下のようなデータをTweetsテーブルに格納する。)
エラー
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails(`example_app`.`tweets`, CONSTRAINT `tweets_user_id_foreign` FOREIGN KEY(`user_id`) REFERENCES `users` (`id`)) (Connection: mysql, SQL: ...
原因
シーディングを実行する時にDatabaseSeeder
クラスに以下のように記述していた。
DatabaseSeeder.php
public function run(): void
{
// \App\Models\User::factory(10)->create();
$this->call([
TweetsSeeder::class,
UsersSeeder::class,
]);
}
※先にTweetsテーブルのデータを作成するように記述していたため、Tweetsテーブルのuser_idカラムに格納できるUsersテーブルのIDがない。というエラーが出ていた。
解決策
TweetsSeeder::class
とUsersSeeder::class,
の順番を逆にした。
DatabaseSeeder.php
public function run(): void
{
// \App\Models\User::factory(10)->create();
$this->call([
UsersSeeder::class,
TweetsSeeder::class,
]);
}
無事にシーディングを実行することができた。
参考サイト
使用した本
P.130 ログインユーザーの情報を保存する