Laravel: 親モデルを削除と同時に子モデルを削除する cascading soft-delete / MySQL case and MongoDB case

環境:

Laravel@8.79.0

Jenssegers/mongodb@3.8.4

 

前提:

親モデル >>> User.php

MySQL子モデル >>> Post.php

MongoDB子モデル >>> ProfileDetail.php

 

case MySQL

  • soft-delete に対応させる

migration file に以下を加筆

Schema::create('users', function Blueprint $table) {

  $table->softDeletes();

  ...

}

Schema::create('posts', function Blueprint $table) {

  $table->softDeletes();

  ...

}

 
  • model を編集

composer require askedio/laravel-soft-cascade

github.com

@config/app.php

Askedio\SoftCascade\Providers\GenericServiceProvider::class,

@models/User.php

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model {
  use SoftDeletes;

  use \Askedio\SoftCascade\Traits\SoftCascadeTrait;

 

  protected $softCascade = ['posts'];   // cascading soft-delete 対象の model を登録

}    

@model/Posts.php

use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model {
  use SoftDeletes:

}

 

確認

php artisan tinker

$user = User::first()

$posts = $user->posts()->get()

$user->delelte()

  >>> $user の deleted_at column に値が入り soft-delete 状態になる

$user->post()->get()

  >>> null

$posts

  >>> 先に取得した$posts の値を返す (データを消去したわけではないので先に変数として取得していれば値を返す。この際、deleted_at column は users と違い、値は入らずブランクのまま)

$user->restore()

  >>> deleted_at column がブランクになる

$user->posts()

  >>> 値を返すようになる

 

case MongoDB

  • soft-delete に対応させる

migrarion file に以下を追記

Schema::create('users', function Blueprint $table) {

  $table->softDeletes();

  ...

}

  • model を編集

@model/ProfileDetail.php

use Moloquent;

use Jenssegers\Mongodb\Eloquent\SoftDeletes;

 

class ProfileDetail extends Moloquent {

  use SoftDeletes;

  protected $dates = ['deleted_at'];

}

github.com

  • cascade delete に対応させる

laravel-soft-cascade が mongoDB に対応していないのでマニュアルでuser が delete された場合、子モデルも delete されるようにする

@model/User.php

以下を加筆 【boot をオーバーライド】

public static function boot() {

  parent::boot();

  static::deleted(function ($user) {

    $user->profileDetail()->delete();

  });

  static::restored(function ($user)) {

    $user->profileDetail()->restore();

  }

}

 

確認

php artisan tinker

$user = User::first()

$profileDetail = $user->profileDetail()->get()

$user->delete()

$user->profileDetal()->get()

  >>> null

$user->restore()

$user->profileDetal()->get()

  >>> 値を返す

 

ref:

yaba-blog.com