首页 > 解决方案 > Laravel:编辑一对多关系字段

问题描述

我有一个类似于这样的表结构:

id名称超级大国
 1个速度
 2 耐力
 3B速度
 4C电源
 5B电源
 6D讽刺

名称与 Superpower 具有一对多的关系。要编辑这些字段,前端表单会返回名称的超级大国数组。即,“编辑 A”表格可能会返回['speed','power'](消除耐力并增加力量)。

使用纯 PHP 执行此操作的一种简单方法是删除名称的所有超能力并添加新的超能力。在 Laravel 中执行此操作的最佳方法是什么?

标签: phplaraveleloquent

解决方案


所以你有一个 User 模型(用于身份验证),一个 Kid 模型用于孩子的详细信息,然后是 Superpower 模型用于超级大国的详细信息。

我看到你有两个选择。选项一需要更大的结构更改,但控制器逻辑更简单,而另一种则在控制器中更重。

1 -

与孩子和超级大国建立多对多的关系。如果用户可以添加对所有其他用户可见的新超能力,这可能不适合您的用例。这将涉及一个数据透视表,该表将存储孩子和超级大国之间的每个联系。

当返回一组超级大国链接到一个孩子时(假设一个复选框列表正在表单中提交),您可以使用关系的sync方法:

$kid->superpowers->sync($superpowers);

2 -

如果您想基本保持您的关系,我建议至少更改您在问题中提出的表结构,以便该name字段为kid_id. 这将更加标准,这样一个孩子就会与超级大国有一个 hasMany 关系,而一个超级大国将与一个孩子有一个 belongsTo。

然后你可以打电话:

foreach ($request->superpowers as $superpower) {
    $superpowers[] = ['superpower' => $superpower];
}

$kid->superpowers->delete();
$kid->superpowers->createMany($superpowers);

这种方法的一个显着缺点是首先要删除数据以进行同步。生成的created_at时间戳将不正确。


推荐阅读