Laravel:编辑一对多关系字段

时间:2018-06-10 00:59:09

标签: php laravel eloquent

我有一个与此类似的表结构:

id   name   superpower
 1     A      speed
 2     A      stamina
 3     B      speed
 4     C      power
 5     B      power
 6     D      sarcasm

姓名与Superpower有一对多的关系。要编辑这些字段,前端表单将返回名称的超级电源数组。即,编辑A'表格可以返回['speed','power'](去除耐力并增加力量)。

使用纯PHP执行此操作的简单方法是删除名称的所有超级大国并添加新的超级大国。 Laravel最好的办法是什么?

1 个答案:

答案 0 :(得分:2)

所以你有一个用户模型(用于auth),一个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时间戳将不正确。