Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
13
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@naomichi-y

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

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
13
Help us understand the problem. What are the problem?