文章目录

  • 前言
  • 一、GROM多表关联
  • 二、原生Sql多表关联


前言

  • 对比GROM多表关联和原生Sql多表关联

一、GROM多表关联

  1. 适用于返回全部数据
  2. 需要逻辑外键(不会在数据库创建任何约束)
  3. 适合三个表以下的关联
  4. 有几张表就会查询几次

type Product struct {gorm.Model           // 包含ID, CreatedAt, UpdatedAt, DeletedAtCateID       uint    `gorm:"not null;index:idx_cate_id" json:"cate_id"`          // 普通索引TagID        string  `gorm:"size:255;not null;index:idx_tag_id" json:"tag_id"`   // 多标签字符串存储,如"1,2,3"Name         string  `gorm:"size:255;not null;uniqueIndex:idx_name" json:"name"` // 唯一索引Sku          string  `gorm:"size:50;not null;uniqueIndex:idx_sku" json:"sku"`    // 唯一索引Price        float64 `gorm:"type:decimal(10,2);not null;default:0.00" json:"price"`Stock        int     `gorm:"not null;default:0" json:"stock"`StockWarning int     `gorm:"not null;default:0" json:"stock_warning"`CostPrice    float64 `gorm:"type:decimal(10,2);not null;default:0.00;" json:"cost_price"`Status       int8    `gorm:"type:tinyint;not null;default:1;index:idx_status" json:"status"` // 普通索引Description  *string `gorm:"type:text" json:"description"`ImageUrl     *string `gorm:"size:255" json:"image_url"`Unit         string  `gorm:"size:255;not null" json:"unit"`// 🔗 关联关系:多对一 (多个商品属于一个分类)// 🔗 关联关系:多对一 (多个商品属于一个分类)// 逻辑外键 不会同步到数据库中,仅在此模型或项目内使用Category OrderCate `gorm:"foreignKey:CateID" json:"category"`
}//GROM示例
// 查询商品及其分类信息(GORM联查)
func GetProduvtWithCategroy(id uint) (*Product , error){var product Product// 步骤1. First(&product) 先根据id查询商品表,获取到producr.CateID// 步骤2. Preload("Category"),再根据获取到的分类id查询分类表,获取到分类信息后返回到Category字段// 合并结果,将分类信息填充到 product.Category字段result := DB.Preload("Category").Where("id = ?" , id).First(&product)return &product, result.Error
}

二、原生Sql多表关联

  1. 适用于三个表以上关联
  2. 只查询一次
  3. 适用于返回精准字段

// 商品列表结果结构体(用于API返回)
type ProductListResult struct {ID           uint    `json:"id"`Name         string  `json:"name"`Price        float64 `json:"price"`Stock        int     `json:"stock"`Status       int8    `json:"status"`CateID       uint    `json:"cate_id"`CategoryName string  `json:"category_name"`ImageUrl     *string `json:"image_url"`
}// 一方面减少查询次数,一方面精准控制返回字段// 步骤1. FROM products p; 查询商品表 p为表代号
// 步骤2.  LEFT JOIN products_cate c ON p.cate_id  = c.id;左连接分类表(根据cate_id关联分类表主键id,左连接保证即使分类表中没有对应记录,商品信息也能显示)
// 步骤3. WHERE p.deleted_at IS NULL 过滤已删除的商品
// 步骤4. ORDER BY p.created_at DESC 按创建时间倒序排序
// 步骤5. SELECT  查询指定字段, COALESCE:判断字段是否为空,如果为空则返回默认值
// 步骤6. LIMIT 10 OFFSET 0 分页查询,每页10条,从第0条开始
// 步骤7. Raw() 执行SQL语句,Scan() 将查询结果映射到results切片中// 左连接: 左连接会保留左表的所有数据,即使右表中没有匹配的数据,也会保留左表的数据。
// 右连接: 右连接会保留右表所有的数据,即使左表中没有匹配的数据,也会保留右表数据。
// 内连接: 内连接只返回两个表中匹配的数据,如果一个表中没有匹配的数据,则不会返回结果。func GetProductListWithCategory() ([]ProductListResult, error) {var results []ProductListResultsql := `SELECTp.id,p.name,p.price,p.stock,p.status,p.cate_id,COALESCE(c.name, '未分类') as category_name,p.image_urlFROM products pLEFT JOIN products_cate c ON p.cate_id = c.idWHERE p.deleted_at IS NULLORDER BY p.created_at DESC`err := DB.Raw(sql).Scan(&results).Errorreturn results, err
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90274.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90274.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90274.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式六:工厂模式(Factory Pattern)

概念定义一个创建对象的接口&#xff0c;但让子类决定实例化哪个类。实现示例#include <iostream> #include <memory>// 产品基类 class Product { public:virtual void use() 0;virtual ~Product() default; };// 具体产品A class ConcreteProductA : public Pr…

应用层自定义协议【序列化+反序列化】

文章目录再谈 “协议”重新理解read、write、recv、send和tcp为什么支持全双工Server.cc网络版计算机实现Socket封装&#xff08;模板方法类&#xff09;socket.hpp定制协议JsonJson安装定义一个期望的报文格式Protocol.hppParser.hppCalculator.hpp完整的处理过程Client.cc三层…

dify创建OCR工作流

实现ocr识别文件内容&#xff0c;引用dify的一个插件&#xff0c;插件名称&#xff1a;mineru 引用在线版本mineru 具体操作说明&#xff0c;参见视频&#xff1a; 第六篇&#xff1a;DifyOCR&#xff0c;扫描件最优解_哔哩哔哩_bilibili 引用本地部署mineru 上面的这种使用…

备受关注的“Facebook Email Scraper”如何操作?

Facebook Email Scraper&#xff08;脸书邮箱提取工具&#xff09;是一类用于从Facebook平台提取公开邮箱信息的工具&#xff0c;其核心功能是通过解析用户主页、群组、页面等公开内容&#xff0c;识别并提取其中包含的邮箱地址&#xff0c;为用户提供结构化的联系方式数据。这…

【网络原理】万字长文解密UDP/TCP——手把手教你理解网络通信

目录 1.前言 2.正文 2.1UDP协议 2.1.1UDP协议端格式 2.1.2UDP的特点 2.1.3理解UDP的“不可靠” 2.1.4面向数据报 2.1.5基于UDP的应用层协议 2.2TCP协议 2.2.1TCP协议端格式 2.2.2TCP十个核心机制 2.2.2.1确认应答 2.2.2.2超时重传 确认应答超时重传 vs 三次握手 …

MATLAB软件使用频繁,企业如何做到“少买多用”?

在制造企业的工程计算、算法研发、系统建模等场景中&#xff0c;MATLAB 已成为不可或缺的核心工具。 无论是动力学建模、控制算法开发&#xff0c;还是信号处理和数据可视化&#xff0c;MATLAB 的高频使用场景覆盖了从研发部门到测试部门的多个岗位。然而&#xff0c;企业 IT 负…

数据结构自学Day13 -- 快速排序--“分而治之”

&#x1f536; 一、快速排序&#xff08;Quick Sort&#xff09;&#x1f4cc; 基本思想&#xff1a;分而治之&#xff1a;每次从数组中选一个“基准”&#xff08;pivot&#xff09;&#xff0c;把比它小的放左边&#xff0c;大的放右边。对左右子数组递归排序。&#x1f9e0;…

Linux 进程与服务管理~进程基础、进程查看、进程控制、服务管理、开机启动​​

在 Linux 系统中,进程与服务管理是运维和开发的核心技能之一。进程是程序运行的实例,服务是长期运行的后台进程(守护进程)。掌握进程与服务的管理方法,能有效排查系统问题、优化资源使用。以下从 ​​进程基础、进程查看、进程控制、服务管理、开机启动​​ 五大模块详细讲…

论文笔记 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes

论文地址&#xff1a;Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes 概述&#xff1a;本文提出 RGB-Stacking 基准测试&#xff0c;研究如何仅凭 RGB 摄像头视觉和本体感知&#xff0c;实现机器人对 复杂几何物体的高效堆叠。通过结合仿真专家训练、交互…

React 英语打地鼠游戏——一个寓教于乐的英语学习游戏

&#x1f3af; 英语打地鼠游戏 一个寓教于乐的英语学习游戏&#xff0c;通过经典的打地鼠玩法帮助用户学习英语单词。 ✨ 项目特色 &#x1f3ae; 游戏化学习 经典打地鼠玩法&#xff1a;6 个洞穴&#xff0c;听英文选单词即时反馈&#xff1a;答对/答错立即语音提示计分系…

Qt--Widget类对象的构造函数分析

Widget类对象的构造函数分析&#xff0c;用更直观的方式解释这段代码的作用和工作原理&#xff1a;代码&#xff1a;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }代码解析 Widget::Widget(QWidget *parent) // 构造函数定…

使用pytorch创建模型时,nn.BatchNorm1d(128)的作用是什么?

在PyTorch中&#xff0c;nn.BatchNorm1d(128) 的作用是对 一维输入数据&#xff08;如全连接层的输出或时间序列数据&#xff09;进行批标准化&#xff08;Batch Normalization&#xff09;&#xff0c;具体功能与实现原理如下&#xff1a; 1. 核心作用 标准话数据分布 对每个批…

【数据结构】二叉树的链式结构--用C语言实现

1.二叉树的链式结构 此前&#xff0c;我们通过数组&#xff08;顺序表&#xff09;完成了二叉树的顺序存储&#xff0c;并实现了二叉树的基础功能 那么&#xff0c;二叉树还有没有其他存储方式呢&#xff1f; 前面我们学习了链表&#xff0c;它是一种线性结构&#xff0c;而二…

java设计模式 -【适配器模式】

适配器模式的定义 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于解决接口不兼容问题。通过将一个类的接口转换成客户端期望的另一个接口&#xff0c;使原本因接口不匹配而无法工作的类能够协同工作。 核心角色 目标接口&#xff08;…

前端,demo操作,增删改查,to do list小项目

demo操作&#xff0c;html<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>&l…

Spring AI 项目实战(十九):Spring Boot + AI + Vue3 + OSS + DashScope 构建多模态视觉理解平台(附完整源码)

系列文章 序号 文章名称 1 Spring AI 项目实战(一):Spring AI 核心模块入门 2 Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码) 3 Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码) 4

在 Ubuntu 20.04.5 LTS 系统上安装 Docker CE 26.1.4 完整指南

在 Ubuntu 20.04.5 LTS 系统上安装 Docker CE 26.1.4 完整指南版本选择说明 为什么选择 Docker CE 26.1.4&#xff1f; 1. 版本稳定性和成熟度 Docker CE 26.1.4 是 2024 年 5 月发布的稳定版本&#xff0c;经过了充分的测试和验证相比最新的 28.x 版本&#xff0c;26.1.4 在生…

避坑指南:Windows 11中 Docker 数据卷的存放位置

在 PowerShell 中使用 docker volume inspect 命令&#xff0c;输出如下&#xff1a; [{"CreatedAt": "2025-07-23T01:00:45Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/…

Hadoop大数据集群架构全解析

技术概述Hadoop的定义及其在大数据领域的地位Hadoop是由Apache基金会开发的开源分布式计算框架&#xff0c;基于Google的MapReduce和GFS论文思想实现&#xff0c;已成为大数据处理的事实标准。它通过分布式存储和计算解决了传统数据库无法处理的海量数据存储和分析问题&#xf…

【自动化测试】Selenium Python UI自动化测试实用教程

一、引言:Selenium与UI自动化测试基础 1.1 Selenium简介 Selenium是一个开源的Web应用自动化测试框架,支持多浏览器(Chrome、Firefox、Edge等)和多编程语言(Python、Java、JavaScript等),核心组件包括: WebDriver:通过浏览器原生API控制浏览器,模拟用户操作(点击、…