搜索
首页后端开发Golang如何查询关系的嵌入值等于特定值的模型?

如何查询关系的嵌入值等于特定值的模型?

在开发和设计数据库模型时,有时我们需要查询关系中的嵌入值是否等于特定值。这个问题在实际应用中经常遇到,但解决起来可能并不容易。在本文中,我将向大家介绍一种有效的方法来查询关系的嵌入值是否等于特定值的模型。无需担心,我会用简明易懂的语言解释清楚,帮助您快速理解并应用到实际开发中。让我们一起来看看吧!

问题内容

我有两个不同的模型(carstypes),它们彼此相关(属于关系),其中两个模型都有一个嵌入式 struct 用于公共数据(post)。我想检索某些 types,但只想收到 postcars 值等于某个值的答案。

shorty说,根据下面的模型,我想找到所有types,其中cars.post.published等于true。

模型

type post struct {
  published bool
}

type car struct {
  gorm.model
  brand string
  post post `gorm:"embedded"`
}

type type struct {
  gorm.model
  name string
  carid uint32
  car car
  post post `gorm:"embedded"`
}

使用 db.preload("car").find(&type) 我能够在答案对象中获取 car 值。如果我在 car 结构上使用 where() 函数(即 where(car{brand: "volvo"}) 我可以通过 brand 获取值,但是当使用 post 时(即 where(car{post: post {published: true})) 它只会返回所有内容。

我最好使用需要查询的主模型作为 where() 函数的基础。例如:

q := Type{Car: Car{Post: Post{Published: true}}}
db.Preload("Car").Where(q).Find(&Type)

...但这似乎不起作用。如何在不使用原始 sql 生成器的情况下实现这样的查询?

解决方法

我能够通过以下方式解决您的问题。首先,我将分享代码,然后我将介绍值得解释的要点。

package main

import (
    "fmt"

    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

type Post struct {
    Published bool
}

type Car struct {
    gorm.Model
    Brand  string
    TypeID int
    Type   Type
    Post   Post `gorm:"embedded"`
}

type Type struct {
    gorm.Model
    Name  string
    CarID int
    Post  Post `gorm:"embedded"`
}

func main() {
    dsn := "host=localhost port=54322 user=postgres password=postgres dbname=postgres sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn))
    if err != nil {
        panic(err)
    }
    db.AutoMigrate(&Car{})
    db.AutoMigrate(&Type{})

    // uncomment these to seed data
    // db.Create(&Car{Brand: "Tesla", Type: Type{Name: "SUV", Post: Post{Published: true}}, Post: Post{Published: true}})
    // db.Create(&Car{Brand: "Ford", Type: Type{Name: "City", Post: Post{Published: false}}, Post: Post{Published: false}})

    var cars []Car
    if err := db.Debug().Model(&Car{}).Preload("Type").Where(&Car{Post: Post{Published: true}}).Find(&cars).Error; err != nil {
        panic(err)
    }
    for _, v := range cars {
        fmt.Println(v.Type.Name)
    }
}

现在,让我分享一些见解。

结构体定义

我稍微改变了它来处理这个场景。我从 type 结构中删除了 car 字段,并在 car 结构定义中添加了其对应项。

设置和种子

然后,我通过 gorm 设置了数据库连接。我将代码中定义的模型与数据库中存在的关系同步。为了演示,我手动播种了一些虚拟数据。

读取逻辑

然后,我运行查询来获取相关数据。我使用了以下方法:

  1. debug:用于记录实际的sql语句
  2. model:用于指定我们要处理的关系
  3. preload:用于加载type关联
  4. where:用于指定条件(在我们的例子中,过滤器位于嵌入结构上)
  5. find:用于将结果映射到变量

请告诉我这是否有助于解决您的问题,谢谢!

以上是如何查询关系的嵌入值等于特定值的模型?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:stackoverflow。如有侵权,请联系admin@php.cn删除
iBatis与MyBatis:比较与优势剖析iBatis与MyBatis:比较与优势剖析Feb 18, 2024 pm 01:53 PM

iBatis和MyBatis:区别和优势解析导语:在Java开发中,持久化是一个常见的需求,而iBatis和MyBatis是两个广泛使用的持久化框架。虽然它们有很多相似之处,但也有一些关键的区别和优势。本文将通过详细分析这两个框架的特性、用法和示例代码,为读者提供更全面的了解。一、iBatis特性:iBatis是目前较为老旧的持久化框架,它使用SQL映射文件

详解MyBatis注解与动态SQL的操作步骤详解MyBatis注解与动态SQL的操作步骤Feb 18, 2024 pm 03:29 PM

MyBatis注解动态SQL的使用方法详解IntroductiontotheusageofMyBatisannotationdynamicSQLMyBatis是一个持久层框架,为我们提供了便捷的持久化操作。在实际开发中,通常需要根据业务需求来动态生成SQL语句,以实现灵活的数据操作。MyBatis注解动态SQL正是为了满足这一需求而设计的,本

如何解决 Golang 中的错误“ORA-00911:无效字符”?如何解决 Golang 中的错误“ORA-00911:无效字符”?Feb 08, 2024 pm 09:39 PM

我在调用以下函数时遇到错误“ORA-00911:无效字符”。如果我使用带有硬编码值的SQL查询(截至目前,它已在下面的代码片段中注释掉),那么我可以在邮递员中以JSON响应获取数据库记录,没有任何问题。所以,看起来我的论点做错了。仅供参考,我正在使用“github.com/sijms/go-ora/v2”包连接到oracledb。另外,“DashboardRecordsRequest”结构位于数据模型包中,但我已将其粘贴到下面的代码片段中以供参考。请注意,当我进行POC时,我们将使用存

Linux性能调优~Linux性能调优~Feb 12, 2024 pm 03:30 PM

Linux操作系统是一个开源产品,它也是一个开源软件的实践和应用平台。在这个平台下,有无数的开源软件支撑,如apache、tomcat、mysql、php等。开源软件的最大理念是自由和开放。因此,作为一个开源平台,linux的目标是通过这些开源软件的支持,以最低廉的成本,达到应用最优的性能。谈到性能问题,主要实现的是linux操作系统和应用程序的最佳结合。一、性能问题综述系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如

MySQL如何声明变量MySQL如何声明变量Feb 18, 2024 pm 01:53 PM

MySQL是一种常用的关系型数据库管理系统,它支持变量的定义和使用。在MySQL中,我们可以使用SET语句来定义变量,并使用SELECT语句来使用已定义的变量。下面将通过具体的代码示例来介绍如何在MySQL中进行变量的定义和使用。首先,我们需要连接到MySQL数据库。可以使用以下命令连接到MySQL数据库:mysql-u用户名-p密码接下来,我们可以

比较JPA和MyBatis:如何确定最适合的持久化框架?比较JPA和MyBatis:如何确定最适合的持久化框架?Feb 18, 2024 pm 02:12 PM

JPAvsMyBatis:如何选择最佳的持久化框架?引言:在现代软件开发中,使用持久化框架来处理数据库操作是必不可少的。JPA(Java持久化API)和MyBatis是两个常用的持久化框架。然而,如何选择最适合你的项目的持久化框架是一个具有挑战性的任务。本文将分析JPA和MyBatis的特点,并提供具体的代码示例,帮助你做出更明智的选择。JPA的特点:J

深入了解MyBatis标签:掌握MyBatis常用标签的功能和用法深入了解MyBatis标签:掌握MyBatis常用标签的功能和用法Feb 18, 2024 pm 03:43 PM

MyBatis标签详解:掌握MyBatis中各种常用标签的功能与用法,需要具体代码示例引言:MyBatis是一个强大且灵活的Java持久化框架,广泛应用于Java开发中。了解MyBatis标签的功能和用法对于使用MyBatis进行数据库操作非常重要。本文将详细介绍MyBatis中几个常用的标签,并提供相应的代码示例。一、select标签select标签用于执

深入探索Go语言开源项目的无限潜力:五个项目概要值得留意深入探索Go语言开源项目的无限潜力:五个项目概要值得留意Jan 30, 2024 am 10:48 AM

近年来,Go语言在软件开发领域的应用越来越广泛,吸引了众多开发者的关注和参与。Go语言以其高效的性能、简洁的语法和强大的并发特性,成为了许多开发者的首选语言。在Go语言的生态系统中,开源项目扮演着非常重要的角色,为开发者提供了各种优秀的工具和库。本文将概述五个值得关注的Go语言开源项目,以展示Go语言在软件开发领域的无限潜力。GinGin是一个基于Go语言的

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具