Blog スタッフブログ

Laravel システム開発

[Laravel]リレーションに対応したソフトデリート

システム開発担当のTFです。

※Laravel6系統対応

やり方

  • laravel-soft-cascadeライブラリを導入する
  • config/app.php にlaravel-soft-cascadeの利用設定する
  • migration時に外部キー設定する
  • migrationを実行し、テーブルを作成する
  • ソフトデリートの設定をする
  • 普通にdeleteをするとソフトデリートされる

参考

  【Laravel】リレーション先のデータを論理削除(Soft Delete)する方法
  【Laravel】onDelete(‘cascade’)してるのにリレーションデータが論理削除されない
  【Laravel】migration時に外部キーを設定する
  Laravel 6.x データベース:マイグレーション

サンプル

// laravel-soft-cascadeの導入
composer require askedio/laravel-soft-cascade
<?php

return [
	'providers' => [
	
		// laravel-soft-cascadeの利用設定追加
		Askedio\SoftCascade\Providers\GenericServiceProvider::class,
	];
];
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateParentsTable extends Migration
{
    public function up()
    {
        Schema::create('parents', function (Blueprint $table) {
            $table->bigIncrements('id');
			
            $table->timestamps();
			
			// ソフトデリート用設定
			$table->softDeletes();
        });
    }

    public function down()
    {
        Schema::dropIfExists('parents');
    }
}
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateChildrenTable extends Migration
{
    public function up()
    {
        Schema::create('children', function (Blueprint $table) {
            $table->bigIncrements('id');
			
			// 親の主キー
			$table->unsignedBigInteger('parent_id');
			
            $table->timestamps();
			
			// ソフトデリート用設定
			$table->softDeletes();
			
			// 外部キー(同時削除)
			$table->foreign('parent_id')->references('id')->on('parents')->onUpdate('CASCADE')->onDelete('CASCADE');
        });
    }

    public function down()
    {
        Schema::dropIfExists('children');
    }
}
// migrationの実行
php artisan migrate
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Parent extends Model
{
	// ソフトデリートを利用
	use SoftDeletes;
	
	// laravel-soft-cascadeを利用
	use \Askedio\SoftCascade\Traits\SoftCascadeTrait;

	// 対象リレーション
    protected $softCascade = ['children'];
	
	// リレーション
	public function children()
    {
        return $this->hasMany('App\Models\Child');
    }
}
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Child extends Model
{
	// ソフトデリートを利用
	use SoftDeletes;
}
<?php

namespace App\Http\Controllers;

use App\Models\Parent;

class ParentsController extends Controller
{
	public function destroy(Parent $parent)
    {
		// 削除
		$parent->delete();
    }
}