0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravelのモデルのリレーション先のモデル(親/子)までまとめて削除する

Last updated at Posted at 2020-12-02

モデルとコントローラーの編集

Model.php

class Artist extends Model
{
    //このアーティストが所有するタグ(子1へのリレーション)
    public function tags()
    {
        return $this->hasMany(Tag::class);
    }
    //このアーティストが所有する作品(子2へのリレーション)
    public function works()
    {
        return $this->hasMany(Work::class);
    }
}
Controller.php
    public function destroy($id)
    {
        $artistEdit = Artist::findOrFail($id);

            if (\Auth::id() === $artistEdit->user_id) {
                
                //子供1リレーション(タグ)を削除
                $artistEdit->tags()->each(function ($tag) {
                    $tag->delete();
                });
                
                //子供2リレーション(作品)を削除
                $artistEdit->works()->each(function ($work) {
                    $work->delete();
                });

                //アーティスト(親)を削除
                $artistEdit->delete();
        
                return redirect('/');
            }
            else{    
                return redirect('/');
            }
    }

解説

each は Illuminate\Database\Eloquent\Collection ではなく、Illuminate\Support\Collection クラスのメソッドです。

多対多の場合は、リレーション先のモデルというよりも、 中間テーブルのモデルの操作 となりますので今回のケースが当てはまらない場合もあるかと思います。

0
1
0

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
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?