【问题标题】:Laravel 5: cascade soft deleteLaravel 5:级联软删除
【发布时间】:2015-10-06 01:15:08
【问题描述】:

我有 offersservices 表。

服务是优惠的子项。到目前为止,我已经建立了软删除报价的功能。我还将如何软删除附加的服务?这是我的代码:

移民优惠

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

移民服务

Schema::create('services', function(Blueprint $table) 
{
    $table->increments('id');
    $table->integer('offer_id')->unsigned();   
    ...
    $table->timestamps();
    $table->softDeletes();
});

Schema::table('services', function($table) 
{
    $table->foreign('offer_id')
          ->references('id')
          ->on('offers');
});

模型报价

use SoftDeletes;
protected $dates = ['deleted_at'];

public function services() {
    return $this->hasMany('App\Service');
} 

模型服务

public function offer() {
    return $this->belongsTo('App\Offer');
} 

删除方法

public function destroy($id)
{
    $offer = Offer::find($id);
    $offer->delete();
}

感谢大家的帮助。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    我已将此代码放入 Offer 模型中:

    protected static function boot() {
        parent::boot();
    
        static::deleting(function($offer) {
            $offer->services()->delete();
        });
    }
    

    并添加了缺失的

    use SoftDeletes;
    protected $dates = ['deleted_at'];
    

    在服务模型中。

    【讨论】:

    【解决方案2】:

    您应该为此使用Eloquent events

    Offers::deleted(function($offer) {
        $offer->services()->delete();
    });
    
    Offers::restored(function($offer) {
        $offer->services()->withTrashed()->restore();
    });
    

    【讨论】:

    • 感谢您的努力。我试图将此代码放入底部的删除方法中,但服务仍保留在数据库中。我需要自己写点什么吗?
    • 有人回复吗?谢谢。
    【解决方案3】:

    如果你想在你的 Eloquent 模型中获得级联的 softDeletes,我强烈推荐使用这个库 iatstuti/laravel-cascade-soft-deletes

    作曲家

    // get it with composer.
    $ composer require iatstuti/laravel-cascade-soft-deletes="1.0.*"
    

    快速示例

    入门示例中提供的那个。

    <?php
    
    namespace App;
    
    use App\Comment;
    use Iatstuti\Database\Support\CascadeSoftDeletes;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\SoftDeletes;
    
    class Post extends Model
    {
        use SoftDeletes, CascadeSoftDeletes;
    
        protected $cascadeDeletes = ['comments'];
    
        protected $dates = ['deleted_at'];
    
        public function comments()
        {
            return $this->hasMany(Comment::class);
        }
    }  
    

    【讨论】:

      【解决方案4】:

      你可以这样做。

      self::deleting(function($offer) {
          $offer->services()->delete();
      });
      
      self::restoring(function ($offer) {
         $offer->services()->restore();
      });
      

      您应该先删除/恢复子记录(服务),然后再删除/恢复父记录(报价)。如果不这样做,将触发引用完整性 MySql 错误。

      【讨论】:

      • 它不会触发完整性错误,因为记录只是被软删除。但是,您将在恢复子级之前恢复父级。所以使用self::restored
      猜你喜欢
      • 2013-06-19
      • 2016-05-13
      • 2016-03-05
      • 2010-10-05
      • 2022-11-02
      • 2015-04-28
      • 1970-01-01
      • 2015-04-25
      • 2014-05-07
      相关资源
      最近更新 更多