WEBサイト制作・アプリ開発・システム開発・ブランディングデザイン制作に関するご相談はお気軽にご連絡ください。
構想段階からじっくりとヒアリングし、お客様の課題にあわせたアプローチ手法でお客様の“欲しかった”をカタチにしてご提案いたします。
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();
}
}