🦔

[Laravel]Bootメソッドで関連しているデータを消すのが便利だった

2022/08/04に公開

はじめに

本記事は、筆者による理解の復習・確認やアウトプットの練習のために書いております。
間違った解釈等ございましたら、ご連絡いただけますと幸いです。

前提

Article.php
public function comment()
{
  return $this->hasMany(Comment::class, 'article_id');
}

記事(Article)とコメント(Comment)というテーブルがあり、
1(Article):N(Comment)の関連付けがされている状態。

結論

Article.php
protected static function boot()
{
  parent::boot();
  static::deleting(function ($article) {
    $article->comment()->delete()
  });
}

を書いておくと、該当のArticleを削除する際に紐づいているCommentを同じタイミングで削除してくれます。

ArticleController.php
public function delete(Request $request)
{
  DB::beginTransaction();
  try {
    $article = Article::where('id', $request->id)->first();

    $article->delete(); // このタイミングでcommentも一緒に削除されます。

    DB::commit();
  } catch (\Exception $e) {
    // 省略
  }
}

deletingの他にもcreatingupdatingなど、Eloquentモデルのイベントを使って用途に合わせた記述を行えます。

参考

https://laravel.com/docs/5.6/eloquent#events

GitHubで編集を提案

Discussion