【问题标题】:Laravel onDelete cascade many-to-many relationshipLaravel onDelete 级联多对多关系
【发布时间】:2018-06-28 21:06:51
【问题描述】:

假设我们有表 A、B 和 C(相应的时间戳)

Table ZZ
id
some_fieldZ

Table YY
id
some_fieldY

Table XX
id
b_id
a_id
some_fieldX

Schema::table('XX', function (Blueprint $table) {
    $table->foreign('ZZ')->references('id')->on('ZZ')->onDelete('cascade');
    $table->foreign('YY')->references('id')->on('YY')->onDelete('cascade');
});

是否可以在删除 YY 或 ZZ 中的记录时,相应地删除 XX(也可能是 YY/ZZ)而不改变其结构(将 FK 中的一个从一个表切换到另一个)?

编辑:根据 id 向删除函数中添加一行或拥有一个观察者是我正在考虑的两个解决方案,只是试图探索其他可能的方法来实现它

【问题讨论】:

  • 是的,可能,你正在做的事情可以解决问题
  • 您确实可以在表中的 FK 上使用onDelete,或者创建一个观察者来处理删除。我个人更喜欢观察者方法,因为这样你就可以在你的 eloquent 模型上使用SoftDeletes。
  • 事情是,如果我删除 YY 表中的记录,上面的示例代码“不起作用”,它不会在 XX 中删除,我希望它能够
  • 那是因为您必须在其他表的外键上设置onDelete 才能使其正常工作。

标签: php mysql laravel migration


【解决方案1】:

这是一种没有在 schema 中解决它的解决方案,而是在模型中使用 boot 函数[不会改变任何结构,因此不需要迁移更新]: 确保您在父模型中有关系:

public function XXs()
{
    return $this->hasMany(Path\to\XX::class, 'id', 'id');
}

然后在您的父模型中插入一个触发器(我假设:YY 和/或 ZZ)

protected static function boot()
    {
        parent::boot();

        static::deleting(function ($model) {
            //Delete XXs first
            $model->XXs()->delete();
        });
    }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2017-05-06
相关资源
最近更新 更多