search
LoginSignup
13

More than 3 years have passed since last update.

posted at

updated at

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() のソースコードを参照。

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
What you can do with signing up
13