環境
- PHP8
- MySQL8.0
- Laravel11
やりたかったこと
Laravel 11 で作ったプロジェクトにて、(既にいくつか migration を実行した状態なんだけど) userテーブルの id に uuid を使いたかった。
エラー内容
SQLSTATE[HY000]: General error: 1822 Failed to add the foreign key constraint. Missing index for constraint 'chirps_user_id_foreign' in the referenced table 'users' (Connection: mysql, SQL: alter table `chirps` add constraint `chirps_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:813
809▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
810▕ );
811▕ }
812▕
➜ 813▕ throw new QueryException(
814▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
815▕ );
816▕ }
817▕ }
+9 vendor frames
10 database/migrations/2024_03_15_065601_create_chirps_table.php:14
Illuminate\Support\Facades\Facade::__callStatic()
+26 vendor frames
37 artisan:13
Illuminate\Foundation\Application::handleCommand()
users テーブルに constraint 用のキーがないため、foreign key constraint を追加できないと怒られた。
↓ users テーブルの migration はこんな感じだった。
Schema::create('users', function (Blueprint $table) {
$table->uuid('id');
$table->string('name');
...
外部キーとして users テーブルの主キーを取りたいテーブルはこちら↓
Schema::create('chirps', function (Blueprint $table) {
$table->uuid('id');
$table->foreignUuid('user_id')->constrained()->cascadeOnDelete();
...
原因
users テーブルの id を uuid に変更した際、主キー指定していなかった。
Schema::create('chirps', function (Blueprint $table) {
$table->uuid('id')->primary(); // ->primary()を追加
$table->foreignUuid('user_id')->constrained()->cascadeOnDelete();
...
↑こうしたらいけました。
$table->id();
↑これは勝手に主キーになるが、
$table->uuid()->primary();
↑は主キーだよ!という ->primary()
が必要のようでした。
おまけ
users テーブルの主キーを uuid にしたら、 sessions テーブルの外部キーも ->foreignUuid
にしないとログインしてもうまく動かなかったよ!
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignUuid('user_id')->nullable()->index();
...
結局色々考えて、UUID じゃなくて ULID を使うようにしたんですけどね……。