【问题标题】:Soft Delete Cascading with Laravel 5.2使用 Laravel 5.2 软删除级联
【发布时间】:2016-05-13 10:46:36
【问题描述】:

我正在尝试在 Laravel 中实现软删除。

这是我的关系

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

所以,我使用了this answer,这对我有很大帮助

现在,当我软删除锦标赛时,所有相关的 CategoryTournaments 也会被删除。

然后,我尝试递归应用它,所以我在 CategoryTournament 模型中编写了相同的代码:

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

但此代码从未运行过。 我检查了我有要删除的设置和用户,但它们都没有被软删除...

我错过了什么吗???它应该工作!

编辑:

现在,我正在尝试软删除用户,这只是一个级别:

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

所以现在,当我软删除用户时,它会删除他的锦标赛,但不会再删除他的 CategoryTournaments,所以这不是配置错误。

【问题讨论】:

    标签: php laravel soft-delete


    【解决方案1】:

    在您的 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');
      }
    }
    

    【讨论】:

    • 成功了!我为什么要使用foreach???没有foreach,它正在删除categoryTournament!
    • 我只需要在所有模型中重复相同的 foreach,包括它以便我接受你的答案!
    • 看来,删除事件只有在您明确删除每个模型时才会被触发。如果您有时间,请查看活动的运作方式。
    • 根据 Laravel 文档,执行批量删除时实际上并没有检索到记录
    猜你喜欢
    • 2013-06-19
    • 2015-10-06
    • 1970-01-01
    • 2010-10-05
    • 2022-11-02
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多