php - Laravel:编辑一对多关系字段
问题描述
我有一个类似于这样的表结构:
id名称超级大国 1个速度 2 耐力 3B速度 4C电源 5B电源 6D讽刺
名称与 Superpower 具有一对多的关系。要编辑这些字段,前端表单会返回名称的超级大国数组。即,“编辑 A”表格可能会返回['speed','power']
(消除耐力并增加力量)。
使用纯 PHP 执行此操作的一种简单方法是删除名称的所有超能力并添加新的超能力。在 Laravel 中执行此操作的最佳方法是什么?
解决方案
所以你有一个 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
时间戳将不正确。
推荐阅读
- php - 在表格的 ASC 和 DESC 排序之间切换
- java - CompletableFuture - 我如何触发异常?
- mongodb - 在 mongoDB 指南针中连接到 localhost 时出错
- amazon-redshift - Amazon Redshift 中 LISTAGG 函数的替代方法
- dialogflow-es - 如何使用 facebook messenger 进行 Dialogflow 集成?
- reactjs - 通过放大存储reactjs在S3上上传错误
- node.js - NodeJS - 内存不足
- javascript - 有没有办法改变点击事件的函数名?
- sql - SQL 连接和计算行数(计算表中的人)
- mysql - 如何在 che.openshift.io 上托管的 eclipse che 上使用数据库获取持久工作区