gurelog

エンジニアになるため、日々学んだことをまとめています

【Laravel】親モデルを削除したら子モデルも削除されるようにする!

こんにちは。gureです。

今回は親モデルを削除したら子モデルも削除されるようにする方法をまとめました。

 

今回の親→item

子→bookmark です。

商品本体が削除されたら、ユーザーがブックマークしていた商品もブックマークテーブルから削除してね!が今回のお願いです。

切実。

 

モデルに追加

Item.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
 protected $fillable = ['name', 'bland', 'image', 'price'];
 
 public function bookmark()
{
 return $this->hasMany('\App\Models\bookmark');
}

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

 static::deleting(function($item) {
 $item->bookmark()->delete();
});
}
}

 

下記の部分を追加しました。


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

 static::deleting(function($item) {
 $item->bookmark()->delete();
});
}
 

 

boot()メソッドはレコードの登録や削除の際に呼ばれるメソッドだそうです。

ここにdeleting()というメソッドを追加することで、Item::delete()が呼ばれたとき=商品が削除された時、関連するBookmarkモデルが削除されるという仕組みみたいです。

裏であれこれとやってくれているんですね。えらい。

 

 

今回の作業はRailsでいうdepends::destroyにあたるものですね。

同じことをするにも、Laravelには方法が多すぎて迷ってしまいました。

どうやら公式には削除の方法は載っていないらしく、、?調べても公式ではヒットしませんでした、、。

あんなになんでも詳しく載せてくれているのにどうして、、という気持ちです。

 

おしまい。

 

 

参考資料

https://oki2a24.com/2020/08/03/deleting-laravel-related-models/

https://qiita.com/naomichi-y/items/a2a0e7e74048871de5e6