1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravel 11 で id を uuid にしようと思ったらエラーになった話

Last updated at Posted at 2024-04-02

環境

  • 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 を使うようにしたんですけどね……。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?