例如,我们有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.); }
我需要使用此方法更改整个项目。因为没有一个。我正在寻找最好的方法来做到这一点。我写了两个可能的解决方案,但我仍然不知道如何使它们正确。我希望我能解释一下,谢谢你提前
答案 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
,但它会向您显示您可以访问的模型事件。