Laravel - 如何用belongsTo关系删除模型的多态关系?

时间:2016-12-23 18:59:36

标签: php laravel

我有4张桌子。其中两个是单态,其中两个是多态

单形: 模板,模块

多晶型: 文件,图像

现在,templatesmodules同时拥有documentsimages,每个Template都有Modulemodulestemplates具有在删除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与它没有任何关系。

3 个答案:

答案 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() 方法。