レコードが削除されたときに子要素のレコードも一緒に削除する【 Laravel 】

以前、チュートリアルとして Laravel の CRUD 機能 の一つ「削除機能」についてエントリーしました。

今回はさらにもう一歩、リレーション先の子要素も削除したいケースをエントリーします。

 

前提条件

会社テーブル(companies)があり、そのリレーション先の子要素として工場テーブル(factories)があるとします。

会社テーブルにあるレコードを削除すると、その子要素である工場テーブルも全て削除されるようにします。(物理削除)

 

会社テーブル(companies)

 

工場テーブル(factories)

 

手順

 

テーブルをリレーションする(紐づける)

一つの会社には複数の工場を持っています。

会社と工場の関係は1:多の関係(hasMany)になります。

よって、会社のモデル(Company.php)には以下のように記述することになります。


:
 // リレーション
 public function factories()
 {
     return $this->hasMany('App\Models\Factory');
 }
:

 

子要素にあたる工場のモデル(Factory.php)は以下のように belognsTo() を記述します。


:
 public function companies()
{
    return $this->belongsTo('App\Models\Company');
}
:

 

もし、Laravel のリレーションに関して詳しく知りたい方は以下のページをご参照ください。

 

モデルにbootメソッドを追加

親にあたるモデル(Company.php)に boot メソッドを追記します。

【 boot メソッド 】
boot メソッドは Eloquent の初回呼び出し時に初期設定を行うものです。
ここでは boot メソッドをオーバーライドしています。
これによりデータ削除時に、リレーション先の Factory も削除してくれます。

:
// リレーション
public function factories()
{
    return $this->hasMany('App\Models\Factory');
}

// リレーション先のデータも削除
public static function boot()
{
parent::boot();
    static::deleted(function ($company) {
        $company->factories()->delete();
    });
}

【 booted メソッド 】
readouble の説明では、モデルの初期設定を行う方法として Laravel6 までは boot メソッドが使われていますが、Laravel7以降では booted メソッドが使われていました。

 

動作確認(物理削除)

実際に会社のレコードを削除してみましょう。

以下のように子要素のレコードも削除されれば OK です。
 

会社

 

工場

 

論理削除も可能

会社テーブルと工場テーブルに論理削除のカラムを追加し、CompanyモデルとFacotryモデルに論理削除の設定をしてあげると物理削除からそのまま論理削除に変わります。

論理削除に関しては以下のページをご参考にください。

 
以上です。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-実践知識