我有4张桌子。其中两个是单态,其中两个是多态。
单形: 模板,模块
多晶型: 文件,图像
现在,templates
和modules
同时拥有documents
和images
,每个Template
都有Module
个modules
和templates
具有在删除Template
时设置为级联的外键。
现在,如果删除Module
,将删除关联的Module
,但Module
的关联多态关系将保留在数据库中。我没有尝试任何东西,因为我完全无能为力。
删除Template
时,我可以做些什么来自动删除 frame1 = pd.DataFrame(res.items(), columns=['Region', 'Ratio'])
Region Ratio
0 Midwest 0.005669
1 Northeast 0.008920
2 North 0.006374
3 South 0.002904
4 Southeast 0.001928
的关联?我认为这里的删除是由数据库本身处理的,而Eloquent与它没有任何关系。
答案 0 :(得分:2)
因为它是多态关系,所以外键不能处理级联删除。
如果您仍希望在数据库级别处理删除,则需要编写某种类型的数据库触发器功能。
如果您想在应用程序级别处理此问题,还有几个选项。
一种选择是更新您的代码,以便在您删除Template
的任何位置时,还要确保删除所有内容的多态关系。
另一种选择是为deleting
事件创建事件处理程序。每当您删除Eloquent模型时,Eloquent都会触发deleting
事件。在此删除事件中,您可以访问多态关系并删除它们。
如果deleting
事件方法听起来不错,那么有一个软件包可以为您实现所有这些功能,并且可以非常轻松地为您的模型设置:shiftonelabs/laravel-cascade-deletes
。完全披露:我写了包。
使用此包,您只需将CascadesDeletes
特征添加到Template
模型,然后添加$cascadeDeletes
属性,其中包含要在{{Template
时删除的所有关系的数组。 1}}实例被删除。
答案 1 :(得分:0)
它不是全自动的,但是我使用Object.values(firstObject).forEach(console.log) // a, b, c
Object.values(secondObject).forEach(console.log) // a, b, c
雄辩的方法非常轻松。 https://laravel.com/docs/8.x/eloquent#deleting-an-existing-model-by-key另外,当您将其与Laravel Queues配合使用时,它的工作原理就像是一种魅力……
示例:
destroy()
答案 2 :(得分:0)
您实际上可以对两种类型的关系使用 delete 方法:
$template = Template::find(1);
$template->modules()->delete();
$template->images()->delete();
$template->delete();
这里的重点是 $template->modules
返回一个集合实例,而 $template->modules()
返回一个雄辩的关系,您可以在其中链接 delete() 方法。