如何在 laravel 8 中使用 Cascade Soft Delete Trait?

Posted

技术标签:

【中文标题】如何在 laravel 8 中使用 Cascade Soft Delete Trait?【英文标题】:How to use Cascade Soft Delete Trait in laravel 8? 【发布时间】:2022-01-07 18:42:45 【问题描述】:

$inst = 机构::find($institution->id); $campus = InstitutionCampusId::where('institution_campus_id.institution_id' , $institution->id); $inst->删除(); $campus->delete();

【问题讨论】:

【参考方案1】:

级联删除在数据库级别处理,因此当您在迁移中设置 onDelete('cascade') 时,这将转化为您的数据库删除由外键附加的所有记录。

软删除由应用程序处理,因此您需要在父模型上触发一个事件并在子模型上监听它,或者在您的父模型中绑定 static::deleted() 方法boot 方法,并删除那里的关系。

我不确定你是否可以这样做:

public static function boot()

    parent::boot();

    static::deleted(function ($model) 
        // Probably lazy load these relationships to avoid lots of queries?
        $model->load([ 'relationshipOne', 'relationshipTwo', ]);

        $model->relationshipOne()->delete();
        $model->relationshipTwo()->delete();
    );

或者如果您必须遍历相关项目:

public static function boot()

    parent::boot();

    static::deleted(function ($model) 
        $model->relationshipOne->each(function ($item) 
            $item->delete();
        );

        $model->relationshipTwo->each(function ($item) 
            $item->delete();
        );
    );

【讨论】:

【参考方案2】:

将特征添加到您的模型 use SoftDeletes; 并在迁移时在模式创建结束时添加 $table->softDeletes()(这将自动创建 deleted_at 列)

对于查询,您可以使用雄辩的方法来获取仅删除或不删除条目,例如:

仅获取已删除的条目:$query->onlyTrashed(),

仅获取未删除的条目:$query->withoutTrashed(),

获取所有条目(已删除):$query->withTrashed()

要在垃圾箱中发送条目,请使用:$model->delete()

要永久删除条目,请使用:$model->forceDelete()

【讨论】:

但是可以告诉我如何进行级联删除。packagist.org/packages/dyrynda/laravel-cascade-soft-deletes 试试***.com/a/70182554/10460577【参考方案3】:

在你的模型中添加这个特征

use SoftDeletes;

在您的迁移中添加它,它将在您的表中添加已删除的字段

$table->softDeletes();

【讨论】:

这只是软删除,不是级联删除。

以上是关于如何在 laravel 8 中使用 Cascade Soft Delete Trait?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 的现有列中添加“ON DELETE CASCADE”

Laravel 外键 onDelete('cascade') 不起作用

如何在 Laravel 8 中使用 srmklive/laravel-paypal v3

如何在一对一关系中使用 onDelete: 'CASCADE'

如何在 Laravel 8 中使用 JavaScript 获取?

如何在 Laravel 8 模块中使用 InertiaJS 加载 Vue 组件