【Laravel】親テーブルは物理削除、子テーブルは論理削除する方法

Laravel9で「一対一」のリレーションを組んでいる親子テーブルのデータを同時に削除する際に、親テーブルは物理削除、子テーブルは論理削除する必要がありました。

Laravelではどうしたらできるのか調べたのでやり方をまとめます。

テーブルの関係

usersとmembersのデータは「一対一」のリレーション関係で親がusers、子がmembersとなっています。

モデルの論理削除の設定を削除

最初は、UserモデルのsoftDeletsを削除して物理削除にするだけでOKだと思いました。

この設定のみでmemberとuserを同時削除しようとしても、外部キー制約にかかってuserの方を物理削除できません。

memberは論理削除でテーブル上にデータが残るのに対し、userのデータが物理削除されると整合性とれなくなるためエラーがでます。

外部キー制約にかからないようにするためには、membersテーブルのuser_idの外部キー制約を調整する必要があります。

membersテーブルの外部キー制約を調整

membersテーブルのマイグレーションファイルを修正して、外部キー制約を調整します。

ポイントは2つです。

①user_idの外部キー制約に「->onDelete(‘set null’)」を追加してSET NULLにする。

$table->foreign(‘user_id’)->references(‘id’)->on(‘users’)->onDelete(‘set null’);

②user_idをnullableにする。

$table->unsignedBigInteger(‘user_id’, false)->nullable(true)->comment(‘ユーザID’);

これでuser_idの外部キー制約の設定が「SET NULL」となり、リレーション関係にあるuserデータを物理削除時にuser_idの値がNULLに置き換わる事を受け入れる形になります。

これでuserとmemberを同時削除時に親のuserは物理削除、子のmemberは論理削除となります。

\フリーランス制作パートナー募集/

弊社パートナーとして、クリエイティブ制作・システム開発等、各分野で協力しあえるフリーランスのパートナー様を募集しております。詳細等、下記のフォームよりお気軽にお問い合わせくださいませ。スタッフ一同、パートナーシップを構築出来る方との出会いを楽しみにしております。

Related article

おすすめ関連記事