環境:
Laravel@8.79.0
Jenssegers/mongodb@3.8.4
前提:
親モデル >>> User.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
@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'];
}
- 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: