删除关系相关列的最佳方法

时间:2018-06-01 07:35:22

标签: mysql database laravel model relationship

例如,我们有p_categories表和产品表。

p_categories表是:

╔═══╦════════════╦═════════════╗
║   ║ id         ║ name        ║
╠═══╬════════════╬═════════════╣
║ 1 ║ 1          ║ tech        ║
║ 2 ║ 2          ║ food        ║
║ 3 ║ 3          ║ sport       ║
╚═══╩════════════╩═════════════╝

产品表是:

╔════╦═══════════════╦═════╗
║ id ║p_categories_id║name ║
╠════╬═══════════════╬═════╣
║ 1  ║ 1             ║phone║
╠════╬═══════════════╬═════╣
║ 2  ║ 2             ║spoon║
╠════╬═══════════════╬═════╣
║ 3  ║ 2             ║fork ║
╚════╩═══════════════╩═════╝

在pcategory模型中我有:

public function products()
{
    return $this->hasMany(Product::class, 'p_categories_id');
}

在产品型号中:

public function category()
{
    return $this->belongsTo(PCategory::class,'p_categories_id', 'id');
}

当我尝试删除技术类别时,必须同时删除product table id=1, p_categories_id=1, name=phone行。

我认为可能是解决方案:

1)将列类型更改为级联。我看了一些帖子。人们大多不推荐这个。

2)在类别模型中添加新功能

protected static function boot() {
parent::boot();
static::deleting(//something, i don't know how to make.); }

我需要使用此方法更改整个项目。因为没有一个。我正在寻找最好的方法来做到这一点。我写了两个可能的解决方案,但我仍然不知道如何使它们正确。我希望我能解释一下,谢谢你提前

2 个答案:

答案 0 :(得分:1)

您必须使用数据库外键约束。对于使用laravel迁移的make db,您可以使用

$table->foreign('p_categories_id')
      ->references('id')->on('p_categories ')
      ->onDelete('cascade');

请参阅https://laravel.com/docs/5.5/migrations#foreign-key-constraints

答案 1 :(得分:1)

要在模型中使用Eloquent事件,您可以执行以下操作:

static::deleting(function (self $category) {
    $category->products()->delete();
});

如果你需要在产品上触发事件,你需要循环浏览产品并逐个删除它们。例如

$category->products->each(function ($product) {
    $product->delete();
});

documentation并未显示上述方法,而是赞成使用Observers,但它会向您显示您可以访问的模型事件。