Я пытаюсь реализовать мягкое удаление в 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(); });
Но этот код никогда не запускается. Я проверил, что у меня есть настройки и пользователь для удаления, но ни один из них не является мягким удаленным …
Я что-то пропустил??? Он должен работать!
РЕДАКТИРОВАТЬ:
Теперь я пытаюсь Soft удалить пользователя, это всего лишь еще один уровень:
User (HasMany) Tournament ( hasMany ) CategoryTournament (hasOne) CategorySettings
Итак, теперь, когда я мягко удаляю пользователя, он удаляет его турниры, но он больше не удаляет его CategoryTournaments, так что это не ошибка конфигурации.
Внутри вашего static boot
метода static boot
вам нужно выполнить итерацию через ваши отношения toMany
.
Fa:
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'); } }