Мягкое удаление каскадных с Laravel 5.2

Я пытаюсь реализовать мягкое удаление в Laravel.

Вот мои отношения

Tournament ( hasMany ) CategoryTournament (hasOne) CategorySettings
Tournament ( hasMany ) CategoryTournament (belongsToMany) CategoryTournamentUser

Итак, я использовал этот ответ это мне очень помогает

Теперь, когда я SoftDelete Турнир, все связанные с CategoryTournaments также удаляются.

Но затем я попытался применить его рекурсивно, поэтому я написал тот же код в ModelTournament Model:

static::deleting(function($categoryTournament) {
$categoryTournament->settings()->delete();
$categoryTournament->users()->delete();
});

Но этот код никогда не запускался.
Я проверил, что у меня есть настройки и пользователь, чтобы удалить, но ни один из них не удаляется мягко …

Я что-то пропустил??? Он должен работать!

РЕДАКТИРОВАТЬ:

Теперь я пытаюсь удалить пользователя, это просто еще один уровень:

User (HasMany) Tournament ( hasMany ) CategoryTournament (hasOne) CategorySettings

Так что теперь, когда я мягко удаляю пользователя, он удаляет его турниры, но больше не удаляет его CategoryTournaments, так что это не ошибка конфигурации.

11

Решение

Внутри вашего static boot Метод, который вы должны пройти через ваш toMany связи.

F.a:

namespace App;

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

class Tournament extends Model
{
use SoftDeletes;

public function categoryTournament() {
return $this->hasMany(CategoryTournament::class);
}

protected static function boot() {
parent::boot();

static::deleting(function($tournament) {
foreach ($tournament->categoryTournament()->get() as $ct) {
$ct->delete();
}
});
}
}

Другие файлы должны выглядеть так:

CategoryTournament.php

namespace App;

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

class CategoryTournament extends Model
{
use SoftDeletes;

public function tournament() {
return $this->belongsTo(Tournament::class);
}

public function settings() {
return $this->belongsTo(Settings::class);
}

protected static function boot() {
parent::boot();

static::deleting(function($categoryTournament) {
var_dump('categoryTournament');
$categoryTournament->settings()->delete();
});
}
}

Settings.php

namespace App;

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

class Settings extends Model
{
use SoftDeletes;

public function categoryTournament() {
return $this->hasOne(CategoryTournament::class);
}

protected static function boot() {
parent::boot();

static::deleting(function($settings) {
var_dump('settings');
});
}
}

Migration

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

class CreateTables extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up() {

Schema::create('tournaments', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->softDeletes();
});

Schema::create('settings', function (Blueprint $table) {
$table->increments('id');
$table->timestamps();
$table->softDeletes();
});

Schema::create('category_tournaments', function (Blueprint $table) {
$table->increments('id');
$table->integer('tournament_id')->unsigned();
$table->integer('settings_id')->unsigned();
$table->timestamps();
$table->softDeletes();

$table->foreign('tournament_id')->references('id')->on('tournaments');
$table->foreign('settings_id')->references('id')->on('settings');
});
}

/**
* Reverse the migrations.
*
* @return void
*/
public function down() {

Schema::drop('category_tournaments');
Schema::drop('settings');
Schema::drop('tournaments');
}
}
16

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]