问题 使用Laravel 5.2软删除级联


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

这是我的关系

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

所以,我用过 这个答案 这对我很有帮助

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

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

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

但是这段代码从未运行过。 我检查了我有设置和用户删除,但没有一个被软删除...

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

编辑:

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

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

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


6317
2018-02-04 00:48


起源



答案:


你的内心 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
2018-02-16 19:00



有效!我为什么要用foreach ???没有foreach,它正在删除井类别锦标赛! - Juliatzin del Toro
我只需要在所有模型中重复相同的foreach,包括它以便我接受你的答案! - Juliatzin del Toro
看来,只有在显式删除每个模型时才会触发删除事件。如果您有时间,请查看事件的工作方式。 - Gordon Freeman
根据Laravel文档,执行批量删除时实际上不会检索记录 - Vanlalhriata


答案:


你的内心 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
2018-02-16 19:00



有效!我为什么要用foreach ???没有foreach,它正在删除井类别锦标赛! - Juliatzin del Toro
我只需要在所有模型中重复相同的foreach,包括它以便我接受你的答案! - Juliatzin del Toro
看来,只有在显式删除每个模型时才会触发删除事件。如果您有时间,请查看事件的工作方式。 - Gordon Freeman
根据Laravel文档,执行批量删除时实际上不会检索记录 - Vanlalhriata