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

Gorm根据关系模型中的属性查询原模型数据

type ExamResult struct {gorm.ModelExamManagementID uintExamManagement   ExamManagement `json:"examManagement" ` // 一场考试,其中有试卷,有试题,有试题答案//MarkExamPaperRecord MarkExamPaperRecord  //每一场考试对应的结果EachStudentExamResults []EachStudentExamResult `json:"each_student_exam_results"` //每一场考试中有很多批阅试卷和未批阅试卷 ,包含一些基本信息UnreadPaperNumber      uint                    `json:"unread_paper_number" gorm:"comment:待批阅试卷数量"`ExamUserNumber         uint                    `json:"exam_user_number" gorm:"comment:考试人数"`
}
type ExamManagement struct {global.GVA_MODELExamName              string    `json:"exam_name" gorm:"not null;comment:考试名称"`ExamType              string    `json:"exam_type" gorm:"not null;comment:考试类型"`ExamPrice             string    `json:"exam_price" gorm:"not null;default:免费;comment:考试价格"` // /PassingGrade          string    `json:"passing_grade" gorm:"not null;comment:及格分"`ExamDuration          string    `json:"exam_duration" gorm:"not null;comment:考试时长"`NumberOfPoints        string    `json:"number_of_points" gorm:"comment:积分数量"`MinimumSubmissionTime string    `json:"minimum_submission_time" gorm:"comment:最低交卷时长"`ExamDepartmentId      string    `json:"exam_department_id" gorm:"comment:考试所属部门Id"`UserId                string    `json:"user_id" gorm:"comment:指定人员Id"`ThankYouAfterTheExam  string    `json:"thank_you_after_the_exam" gorm:"comment:考后感谢文字"`TimeAllowedToBeLate   string    `json:"time_allowed_to_be_late" gorm:"comment:允许迟到时长"`NotesOnExam           string    `json:"notes_on_exam" gorm:"comment:考前注意事项"`PasswordPassword      string    `json:"password_password" gorm:"comment:口令密码"`TotalScore            string    `json:"total_score" gorm:"comment:考试总分"`State                 string    `json:"state" gorm:"default:正常;comment:状态"`ExamState             string    `json:"exam_state" gorm:"comment:考试状态"`ExamAuthority         string    `json:"exam_authority" gorm:"comment:考试权限"` // (1代表完全公开,2代表部门开放,3代表指定人员,4代表口令密码)ExamTimeSet           time.Time `json:"exam_time_set" gorm:"comment:考试时间设置;default:1970-01-01 08:00:00"`ExamTimeStart         time.Time `json:"exam_time_start" gorm:"comment:考试开始时间;default:1970-01-01 08:00:00"`ExamTimeEnd           time.Time `json:"exam_time_end" gorm:"comment:考试结束时间;default:1970-01-01 08:00:00"`LimitExamTime         bool      `json:"limit_exam_time" gorm:"comment:限制考试时间"`NumberOfExams         uint      `json:"number_of_exams" gorm:"not null;comment:限考次数"`ExamResultDisplay     uint      `json:"exam_result_display" gorm:"comment:考试结果显示;default:1"` // (1代表仅感谢文字,2代表感谢文字+成绩,3代表显示试卷明细)ExamCreatedBy         uint      `json:"exam_created_by" gorm:"comment:考试创建人"`ExamPaperID           uint      `json:"exam_paper_id" gorm:"comment:试卷Id"`ExamPaper             ExamPaper `json:"exam_paper" `DeptID                uint      `json:"dept_id" gorm:"comment:考试所属部门"`
}

上面是两个结构体,一个是考试 ,一个是考试结果(阅卷管理)

下面是一场场的考试

每一场考试都有对应的考试结果(阅卷管理)

我们可以看到阅卷管理上面,有两个筛选条件,一个是考试类型,一个是考试名称,我们的筛选条件不是在考试结果里面,而是在考试结果中的 ExamManagement 字段中,此字段对应的是一个考试对象,所以这个筛选和平常的不一样。

我们先用preload进行一下筛选

func (s *MarkExamPaperService) ReviewPaging(p *request.ParamReviewPaging) (ExamResultList []examination.ExamResult, total int64, err error) {limit := p.PageSizeoffset := p.PageSize * (p.Page - 1)db := global.GVA_DB.Model(&examination.ExamResult{})if p.ExamName != "" {db = db.Preload("ExamManagement", "exam_name like ?", "%"+p.ExamName+"%")}if p.ExamType != "" {db = db.Preload("ExamManagement", "exam_type = ?", p.ExamType)}err = db.Limit(limit).Offset(offset).Find(&ExamResultList).Count(&total).Error //preload获取考试的基本信息return
}

我们使用if判断,当筛选条件不为空的时候,我们使用preload预加载,同时附带上预加载的条件exam_name like ? 和 exam_type = ? ,这个时候我们把返回的结果查看一下

当时我把exam_type = "模拟考试"的时候(此时考试结果里面的考试全部都是正式考试),模拟考试的基本信息还是被查出来了,但是我们想要的结果其实是正式考试,所以此处使用preload不符合要求。

下面我们使用一下Joins,之前一直听说Joins,但是迟迟没有使用,现在这个场景,应该是应用Joins的时候了。

我们最终要筛选的是考试结果,所以我在模型的后面跟了一个Where查询,里面放上一个func 函数,然后在函数里面写上Joins

err = global.GVA_DB.Model(&examination.ExamResult{}).Where(func(db *gorm.DB) {db.Joins("ExamManagement").Where("exam_name like ?", "%"+p.ExamName+"%")}).Find(&ExamResultList,).Count(&total).Error

最终的结果是报错了,Where里面是不能放func的

于是乎,gorm应该是不支持根据模型下面关系模型的属性进行筛选原模型,在我求教他人后,还是我发通过gorm解决这个需求。

解决方案一:

考试结果和考试的模型调换,我们现在是考试结果中有考试,我们可以换成考试中有考试结果,这个时候我们再筛选的时候,我们就是根据考试本身的属性进行筛选了,这样肯定是可以筛选出来的。

解决方案二:

我们使用原生的sql语句,进行连表查询

global.GVA_DB.Raw("SELECT m.exam_name as exam_name,m.exam_type ,r.unread_paper as unread_paper FROM exam_results r INNER JOIN exam_managements m ON r.exam_management_id = m.id WHERE m.exam_name like \"%02%\"").Scan(&ExamResultList)//定义一个用来接收的结构体
type Temp struct {UnreadPaper uint   `json:"unread_paper" gorm:"comment:待批阅试卷数量"`ExamName    string `json:"exam_name" gorm:"not null;comment:考试名称"`ExamType    string `json:"exam_type" gorm:"not null;comment:考试类型"`
}

相关文章:

Gorm根据关系模型中的属性查询原模型数据

type ExamResult struct {gorm.ModelExamManagementID uintExamManagement ExamManagement json:"examManagement" // 一场考试,其中有试卷,有试题,有试题答案//MarkExamPaperRecord MarkExamPaperRecord //每一场考试对应的结…...

车载技术【USB接口】—Android配件协议AOA【AOA连接】

简述 AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式,并给出了USB配件…...

SpringBoot的基本概念和使用

文章目录一、什么是SpringBoot二、Spring Boot优点三、Spring Boot项目创建四、Spring Boot 配置文件1. yml语法2.properties与yml关系3.多系统的配置五、Spring Boot日志文件1.日志对象2.日志级别日志级别的设置System.out.println VS 日志的两个致命缺点3.日志持久化4.更简单…...

基于计算机软件技术的化工设计特点

2.1 便利性将计算机软件技术应用于化工设计环节,最大的优点就在于提升了化工企业生产的便利性。化工设计作为化工生产的基础,在化工设计环节需要到有关化学反应和工艺流程设计等的相关问题,通过利用计算机软件技术可以为上述工作提供很好的辅…...

Nativefier把网页打包成exe

前要: 今天遇到一个需求,之前的应用都是用的h5挂载在企业微信的小应用,但是现在需要电脑运行的exe安装包! 所以需要用到nativefier导报工具:nativefier是一个使用electron将网页转换为app的插件,写这篇博客…...

STM32U5开发(1)----通过 USART1 发送数据

概述 通过 USART1 发送一些数据。 最近在弄ST和GD的课程,需要样片的可以加群申请:6_15061293。 生成例程 使用STM32CUBEMX生成例程,这里使用NUCLEO-U575ZI开发板。 选择工程的时候,先不必选择加载了TrustZone。 样品申请 h…...

20230308 Apdl lsdyna两杆撞击案例学习笔记

本次模拟使用的是ANSYS 16.0 一、设置Element type 首先打开APDL界面 添加element type 在LS-DYNA Explicit选择条件下,选择3D solid 164 二、设置材料类型 选择material models 选择Elastic-Isotropic-输入 Density:密度 EX:杨氏模量 NUXY:泊松比 三、几何模型建…...

互相关延时估计 Matlab仿真

文章目录互相关延时估计什么是互相关延时估计?原理代码实现总结互相关延时估计 互相关延时估计是一种信号处理技术,用于计算两个信号之间的时间延迟。在本篇博客中,我们将使用MATLAB来实现互相关延时估计,并提供多个例子和代码&a…...

谷歌插件Fetch在不同页面之间Cookie携带情况详解

content script 和 script inject 表现情况 在碰到content script 注入和用script标签注入一样&#xff0c;即使服务端有写入Cookie到域名下在该tab标签应用下也不会被保存&#xff0c;所以在发送时也无法自动携带&#xff0c;所以通过content script和<script>这种方式…...

Vue学习笔记(8)

8.1 组件自定义事件 在 Vue 中&#xff0c;组件可以通过自定义事件来实现组件之间的通信。自定义事件可以让一个组件触发一个事件&#xff0c;并向其他组件传递数据。以下是自定义事件的实现步骤&#xff1a; 在组件中定义一个事件名&#xff1a;可以在组件中使用 $emit 方法来…...

知道一个服务器IP应该怎么进入

首先我是国内&#xff0c;访问国外的网站比如谷歌等&#xff0c;访问特别慢&#xff0c;有时候甚至登录不进去。现在知道了一个台湾或者国外的服务器应该怎么登录进去呢&#xff1f;知道服务器IP之后&#xff0c;你还需要知道服务器的远程端口帐号密码才能登录的。知道上面信息…...

【计算机基础】Socket IO

一、I/O 模型 一个输入操作通常包括两个阶段&#xff1a; 等待数据准备好从内核向进程复制数据 对于一个套接字上的输入操作&#xff0c;第一步通常涉及等待数据从网络中到达。当所等待数据到达时&#xff0c;它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复…...

mingw编译opencv

我这里是msys2 这个是msys2的教程 https://blog.csdn.net/qq_39942341/article/details/105931335?ops_request_misc%257B%2522request%255Fid%2522%253A%2522167821146216800197067008%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&requ…...

数据结构(八)排序

一、排序的概念以及引用概念排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;…...

函数习题:用函数实现判断一个整数是否能被n整除

Description 输入一组整数&#xff0c;输入0结束&#xff08;这组整数不包含0&#xff09;&#xff0c;输出其中能被n整除的所有整数之和&#xff08;n为整数&#xff0c;不用考虑n为0的情况&#xff09;&#xff0c; n及这组整数均由键盘输入。首先输入n&#xff0c;再输入一…...

SAP 创建会计冲销凭证

“功能描述&#xff1a;根据传输过来数据创建会计冲销凭证&#xff0c;并返回消息和状态 *”---------------------------------------------------------------------- "“本地接口&#xff1a; *” IMPORTING *" VALUE(IW_ZTFKCX0010) TYPE ZTFKCX0010 *" EXP…...

Jetson(Ubuntu18.04)设备无法ping通百度能ping通局域网错误集合,(神奇的是这样的情况下Todesk等远程确没有问题)

一、.打开DNS,意思是取消注释添加114.114.114.114 &#xff0c;文件如下 vim /etc/systemd/resolved.conf [Resolve] #DNS #FallbackDNS #Domains #LLMNRno #MulticastDNSno #DNSSECno #Cacheyes #DNSStubListeneryes然后重启服务sudo systemctl restart systemd-resolved.se…...

Spring的@Conditional注解

前言Conditional是Spring4新提供的注解&#xff0c;它的作用是按照一定的条件进行判断&#xff0c;满足条件给容器注册bean。Conditional的源码定义&#xff1a;//此注解可以标注在类和方法上 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTI…...

剑指 Offer 67 把字符串转换成整数

摘要 面试题67. 把字符串转换成整数 一、字符串解析 根据题意&#xff0c;有以下四种字符需要考虑&#xff1a; 首部空格&#xff1a; 删除之即可&#xff1b;符号位&#xff1a;三种情况&#xff0c;即 , − , 无符号"&#xff1b;新建一个变量保存符号位&#xff0…...

【教学典型案例】18.开门小例子理解面向对象

目录一&#xff1a;背景介绍业务场景&#xff1a;业务分析&#xff1a;二&#xff1a;实现思路1、面向过程&#xff1a;2、面向对象&#xff08;抽象、封装、继承、多态&#xff09;3、面向对象&#xff08;抽象、封装、继承、多态、反射&#xff09;三&#xff1a;实现过程1、…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...