经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
[Go] 在gin框架gorm下查询一对多的数据
来源:cnblogs  作者:陶士涵  时间:2020/12/21 15:10:12  对本文有异议

go-fly客服系统快捷回复功能 , 需要获取到分组名以及分组名下的回复内容

数据库的表结构是 , group_id是关联字段 , user_id是用户id:

  1. CREATE TABLE `reply_group` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `group_name` varchar(50) NOT NULL DEFAULT '',
  4. `user_id` varchar(50) NOT NULL DEFAULT '',
  5. PRIMARY KEY (`id`),
  6. KEY `user_id` (`user_id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8
  8. CREATE TABLE `reply_item` (
  9. `id` int(11) NOT NULL AUTO_INCREMENT,
  10. `content` varchar(1024) NOT NULL DEFAULT '',
  11. `group_id` int(11) NOT NULL DEFAULT '0',
  12. `user_id` varchar(50) NOT NULL DEFAULT '',
  13. `item_name` varchar(50) NOT NULL DEFAULT '',
  14. PRIMARY KEY (`id`),
  15. KEY `user_id` (`user_id`),
  16. KEY `group_id` (`group_id`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

可以使用下面这种形式变通实现 , 查询两条sql语句 , 程序中对返回的结果进行合并处理

为了不进行嵌套循环 , 使用空间换时间的方式增加了map[string]*ReplyGroup  映射  , 再利用指针的原理 , 直接往结构体成员上增加元素

models下的代码

  1. package models
  2. type ReplyItem struct {
  3. Id string `json:"item_id"`
  4. Content string `json:"item_content"`
  5. GroupId string `json:"group_id"`
  6. ItemName string `json:"item_name"`
  7. UserId string `json:"user_id"`
  8. }
  9. type ReplyGroup struct {
  10. Id string `json:"group_id"`
  11. GroupName string `json:"group_name"`
  12. UserId string `json:"user_id"`
  13. Items []*ReplyItem `json:"items";"`
  14. }
  15. func FindReplyByUserId(userId interface{}) []*ReplyGroup {
  16. var replyGroups []*ReplyGroup
  17. //DB.Raw("select a.*,b.* from reply_group a left join reply_item b on a.id=b.group_id where a.user_id=? ", userId).Scan(&replyGroups)
  18. var replyItems []*ReplyItem
  19. DB.Where("user_id = ?", userId).Find(&replyGroups)
  20. DB.Where("user_id = ?", userId).Find(&replyItems)
  21. temp := make(map[string]*ReplyGroup)
  22. for _, replyGroup := range replyGroups {
  23. replyGroup.Items = make([]*ReplyItem, 0)
  24. temp[replyGroup.Id] = replyGroup
  25. }
  26. for _, replyItem := range replyItems {
  27. temp[replyItem.GroupId].Items = append(temp[replyItem.GroupId].Items, replyItem)
  28. }
  29. return replyGroups
  30. }

 

 返回的结果就是上面截图这种形式了.

 

原文链接:http://www.cnblogs.com/taoshihan/p/14140393.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号