Я пытаюсь реализовать мягкое удаление в 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, так что это не ошибка конфигурации.
Внутри вашего 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');
}
}
Других решений пока нет …