当前位置: 首页 > news >正文

【golang-ent】go-zero框架 整合 ent orm框架 | 解决left join未关联报错的问题

一、场景

在这里插入图片描述

1、子表:cp_member_point_history

cp_member_point_history表中字段:cp_point_reward_id 是cp_point_reward的主键id
当本表中的cp_point_reward_id字段为0(即:没有可关联主表的)

在这里插入图片描述

CREATE TABLE `cp_member_point_history` (`id` bigint NOT NULL AUTO_INCREMENT,`point` int DEFAULT NULL COMMENT '获取积分',`cp_point_reward_id` bigint DEFAULT NULL COMMENT '外键 cp_point_reward 主键id',`show_status` tinyint(1) DEFAULT NULL COMMENT '是否删除:0、可用,1:删除',`updated_at` datetime DEFAULT NULL COMMENT '更新时间',`created_at` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户积分变更历史';

2、主表:cp_point_reward

在这里插入图片描述

CREATE TABLE `cp_point_reward` (`id` bigint NOT NULL AUTO_INCREMENT,`point` int DEFAULT NULL COMMENT '消耗积分',`name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '奖品名称',`reward` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '奖品说明',`reward_status` int DEFAULT NULL COMMENT '1:上架、2:下架(默认是1)',`show_status` tinyint(1) DEFAULT NULL COMMENT '是否删除:0、可用,1:删除',`updated_at` datetime DEFAULT NULL COMMENT '更新时间',`created_at` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='积分奖品';

3、golang 使用 ent 源码

在这里插入图片描述

当 左连接 WithCpPointRewardMPH()时,无法进行关联时,则下面循环时,直接报错panic

package cpMemberPointHistoryimport ("context""fmt""github.com/suyuan32/simple-admin-common/utils/pointy""github.com/zeromicro/go-zero/core/logx"
)type GetCpMemberPointHistoryListLogic struct {ctx    context.ContextsvcCtx *svc.ServiceContextlogx.Logger
}func NewGetCpMemberPointHistoryListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetCpMemberPointHistoryListLogic {return &GetCpMemberPointHistoryListLogic{ctx:    ctx,svcCtx: svcCtx,Logger: logx.WithContext(ctx),}
}func (l *GetCpMemberPointHistoryListLogic) GetCpMemberPointHistoryList(in *cpgobusiness.CpMemberPointHistoryListReq) (*cpgobusiness.CpMemberPointHistoryListResp, error) {var predicates []predicate.CpMemberPointHistoryif in.CpMemberId != nil {predicates = append(predicates, cpmemberpointhistory.CpMemberID(*in.CpMemberId))}if in.CpPointRewardId != nil {predicates = append(predicates, cpmemberpointhistory.CpPointRewardID(*in.CpPointRewardId))}if in.CpResourceId != nil {predicates = append(predicates, cpmemberpointhistory.CpResourceID(*in.CpResourceId))}result, err := l.svcCtx.DB.CpMemberPointHistory.Query().Where(predicates...).WithCpMemberMPH().WithCpPointRewardMPH().WithCpResourceMPH().Page(l.ctx, in.Page, in.PageSize, func(pager *ent.CpMemberPointHistoryPager) {pager.Order = ent.Desc(cpmemberpointhistory.FieldID)})if err != nil {return nil, dberrorhandler.DefaultEntError(l.Logger, err, in)}resp := &cpgobusiness.CpMemberPointHistoryListResp{}resp.Total = result.PageDetails.Totalfor _, v := range result.List {Template := &cpgobusiness.CpMemberPointHistoryInfo{Id:              &v.ID,CreatedAt:       pointy.GetPointer(v.CreatedAt.UnixMilli()),UpdatedAt:       pointy.GetPointer(v.UpdatedAt.UnixMilli()),ShowStatus:      pointy.GetPointer(int64(v.ShowStatus)),CpMemberId:      &v.CpMemberID,Point:           &v.Point,ChangeType:      &v.ChangeType,CpResourceId:    &v.CpResourceID,CpPointRewardId: &v.CpPointRewardID,GainType:        &v.GainType,Name:            &v.Edges.CpMemberMPH.Name,Phone:           &v.Edges.CpMemberMPH.Phone,NickName:        &v.Edges.CpMemberMPH.NickName,Gender:          &v.Edges.CpMemberMPH.Gender,PointName:       pointy.GetPointer(""),ResourceTitle:   &v.Edges.CpResourceMPH.Title,}if v.Edges.CpPointRewardMPH != nil {fmt.Println("------------ v.Edges.CpPointRewardMPH.Name:", v.Edges.CpPointRewardMPH.Name)Template.PointName = &v.Edges.CpPointRewardMPH.Name}resp.Data = append(resp.Data, Template)}return resp, nil
}

4、解决方案

问题:
报错的位置在:&v.Edges.CpPointRewardMPH.Name
因为 v.Edges.CpPointRewardMPHnil

解决

先判断 v.Edges.CpPointRewardMPH 是否为空
如果不为空,则赋值

if v.Edges.CpPointRewardMPH != nil {fmt.Println("------------ v.Edges.CpPointRewardMPH.Name:", v.Edges.CpPointRewardMPH.Name)Template.PointName = &v.Edges.CpPointRewardMPH.Name
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • window11 部署llama.cpp并运行Qwen2-0.5B-Instruct-GGUF
  • python实现插入排序、快速排序
  • 陪玩系统小程序模式APP小程序H5系统搭建开发
  • 微信小程序-组件通信
  • DETR算法解读——Transformer在目标检测任务的首次应用
  • <数据集>铁轨缺陷检测数据集<目标检测>
  • IP转接服务的重要性及其应用
  • linux服务器数据库备份脚本
  • 【JavaScript 算法】拓扑排序:有向无环图的应用
  • 「实战应用」如何用DHTMLX将上下文菜单集成到JavaScript甘特图中(三)
  • 处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题
  • [米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-21 VTC视频时序控制器设计
  • RESTful API设计指南:构建高效、可扩展和易用的API
  • 达梦数据库DM8-索引篇
  • 【GraphRAG】微软 graphrag 效果实测
  • E-HPC支持多队列管理和自动伸缩
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Python 反序列化安全问题(二)
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Spark RDD学习: aggregate函数
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 今年的LC3大会没了?
  • 力扣(LeetCode)965
  • 前端面试之CSS3新特性
  • 使用API自动生成工具优化前端工作流
  • 说说动画卡顿的解决方案
  • 《天龙八部3D》Unity技术方案揭秘
  • Mac 上flink的安装与启动
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # Panda3d 碰撞检测系统介绍
  • #1014 : Trie树
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (4)事件处理——(7)简单事件(Simple events)
  • (8)STL算法之替换
  • (9)STL算法之逆转旋转
  • (c语言)strcpy函数用法
  • (Git) gitignore基础使用
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (备份) esp32 GPIO
  • (二)linux使用docker容器运行mysql
  • (接口自动化)Python3操作MySQL数据库
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (五)Python 垃圾回收机制
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .htaccess配置重写url引擎
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 6 集成和使用 mongodb
  • .NET Core 项目指定SDK版本
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • [ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(十)RCE (远程代码/命令执行漏洞)相关面试题
  • [000-01-022].第06节:RabbitMQ中的交换机介绍