Help us understand the problem. What is going on with this article?

Laravelにおけるリレーショナルモデルの削除

概要

特定のモデルを削除した際に、関連するモデルを同時に削除する方法について。

前提となる条件

Laravel学習目的で開発した monelytics のソースコードをベースに説明を進める。ソースコードは GitHub を参照。

  • PHP 5.5.21
  • Laravel 4.2

実装

テーブル構成

ActivityCategoryGroupモデルは複数のActivityモデルを所有する (※説明を簡略化するため、ここでは最小限のカラムのみ記載する)。

activity_category_groups
CREATE TABLE IF NOT EXISTS `monelytics`.`activity_category_groups` (
  `id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
)
activities
CREATE TABLE IF NOT EXISTS `monelytics`.`activities` (
  `id` MEDIUMINT NOT NULL AUTO_INCREMENT,
  `activity_category_group_id` MEDIUMINT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
)

モデル構成

ActivityCategoryを削除した際に紐付きのあるActivityレコードを削除するには、ActivityCategoryモデルにboot()メソッドを追加する。

app/models/ActivityCategory.php
class ActivityCategory extends Model {
  public function activity()
  {
    return $this->hasMany('Activity');
  }

  public static function boot()
  {
    parent::boot();

    static::deleting(function($activity_category_group) {
      $activity_category_group->activity()->delete();
    });
  }
}

boot()メソッドはレコードの登録や削除の際にコールされるイベントリスナであるため、ここにdeleting()というメソッドを追加する。これによって、ActivityCategory::delete()がコールされたタイミングで関連するActivityモデルが削除されるという仕組みである。

尚、ここでは紹介していないが、A HasMany B HasMany Cといったモデル構成の場合も基本的に同様の流れとなる。サンプルコードは User::boot() のソースコードを参照。

metaps
世界の頭脳へ コンピュータにあらゆるデータを学習させて、人々の最適な意思決定を支える頭脳になることを目指しています。
https://metaps.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした