golang的gorm怎么合并前端传过来的对象数据?

发布于 2022-09-11 21:13:59 字数 627 浏览 18 评论 0

比如用restful标准来新增改查gorm的话

如主子表的数据, 怎么做到前端只传需要变更的数据过来,后端合并起来再保存 ?

主要是想解决通过主表调用用一个restful接口同时更新主表和子表的数据(需要在同一个事务里执行的那种),
但gorm的话,只能用全量更新(db.save)
部分更新的话,会导致子表数据只剩下最后一次传的那些字段, db.updates部分更新不支持子表部分更新

如果有个主子表的订单, 两个表各有10多个字段。
目前想更新的订单有一条主表记录, 三条子表记录
但传值时只想传需要修改的字段过去。
比如, 修改子表某一记录的状态字段,并把主表的状态和订单时间更新一下,同时删除一个子表记录

{
  "id": 2,
  "orderTime": "2019-01-09", // 更新
  "orderDetails": [
    {
      "id": 3,
      "status": 3 // 更新 
    },
    {
      "id": 4,
      "deleteFlag": "Y"// 删除
    }
  ]
}

PS: 这是一个通用的restful接口实现,可以通过这接口crud所有的注册过的model

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

山有枢 2022-09-18 21:13:59

最后的解决方法:

  1. 把传过来的json解析到结构体
  2. 用gorm.scope解析结构体和数据库字段的对应关联。
  3. 循环每个字段,找到Relationship.Kind不为空的字段

    1. kind 为 "has_many", "many_to_many" 时值为数组,循环判断每个元素是否是新数据(是否存在id) 新的调用db.create, 存在的调用db.updates
    2. kind 为 has_one", "belongs_to" 的直接判断值为是否是新数据,新的调用db.create, 存在的调用db.updates
  4. 为主表调用db.updates
  5. 提交事务

这样,在同一次请求,就可以对子表同时做新增, 修改,删除,操作了

{
  "id": 2,
  "orderTime": "2019-01-09", // 更新
  "orderDetails": [
    {
      "id": 3,
      "status": 3 // 更新 
    },
    {
      "id": 4,
      "deleteFlag": "Y"// 删除
    },
    {
      "status": 3 // 新增
    }
  ]
}

PS: 欢迎使用本公司开发的go框架。KUU - https://github.com/kuuland/kuu

  1. 只需要新建结构体, 会自动生成curd的restful接口。
  2. 在Query中还支持前端传操作符过来。
  3. 支持批量新增/更新
  4. 更新支付只传子表需要更新的部分字段。包括子表记录的删除与新增
  5. 本问题所解决的问题框架已经集成
  6. 框架已经通过客户方的渗透测试
绿萝 2022-09-18 21:13:59

你的意思是不是说两个表是主外键关系。
restful接口需要请求两次分别把主的数据和外键表的数据发过来,你需要合并后事物保存吗?

如果是,你需要将两次请求的数据预先保存到全局变量里面,之后收集齐了再

过期情话 2022-09-18 21:13:59

gorm文档里有的
.Where(你的条件).Updates

clipboard.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文