【问题标题】:Laravel: Editing one-to-many relationship fieldsLaravel:编辑一对多关系字段
【发布时间】:2018-06-11 12:23:29
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你可以看看 Laravel 关系的同步方法。
  • “名字”和“超能力”是否与实体有关系?
  • 谢谢@GoogleMac,我会调查的。 Mesuti - 我没有清楚地理解这个问题,但是有一个用于身份验证的用户模型,然后是一个用于孩子详细信息的孩子模型,然后是用于超级大国详细信息的超级大国模型,并且 Kid 和 Superpower 在此表中交互将孩子们与他们的超能力联系起来(一对多)。
  • @GoogleMac 你想把它作为一个更全面的答案发布,我会接受吗?

标签: php laravel eloquent


【解决方案1】:

所以你有一个 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 时间戳将不正确。

【讨论】:

  • 我选择了第一个,带有一个中间表。正确设置关系后,只需一行即可访问所需的所有内容。
猜你喜欢
  • 2020-01-09
  • 2016-08-25
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2021-08-12
  • 2017-11-22
相关资源
最近更新 更多