概要
特定のモデルを削除した際に、関連するモデルを同時に削除する方法について。
前提となる条件
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() のソースコードを参照。