GORM 关联操作基本概念

2018-08-19 golang database

关于 GORM 有些与常规 ORM 不同的基本概念,理解这些概念对于使用 GROM 函数会有很大帮助,而不是简单使用 RAW SQL 实现。

简介

假设有用户以及对应的角色信息,这是多对多的关系,也就是用户可以有多个角色,某个角色也会映射多个用户,那么就有如下的结构体。

type User struct {
    ID    uint `gorm:"primarykey"`
    Name  string
    Roles []*Role `gorm:"many2many:map_user_role"`
}

type Role struct {
    ID    uint `gorm:"primarykey"`
    Name  string
    Users []*User `gorm:"many2many:map_user_role"`
}

最大的不同是在 User 结构体里嵌套了 Role 结构体,传统 SQL 中相互关联的概念在 GROM 里成了相互拥有的概念。现在的关键就是如何从一个结构体出发获取另外的结构体,这里一步步介绍其基本概念和使用方法。

外键

假设某个用户的住址详细信息通过另外一个表保存,也就是在一个 address 表中,然后在 User 结构体内保存了对应地址的 ID 信息,定义如下。

type User struct {
    ID     uint `gorm:"primarykey"`
    Name   string
    AddrID uint
    Addr   *Address
}

type Address struct {
    ID     uint `gorm:"primarykey"`
    City   string
}

这里就是怎么通过 User 结构体 (包含对应的 AddrID 信息) 去 address 表中查找 Address 对象,而在 address 表中。