zoukankan      html  css  js  c++  java
  • GO语言的gorm的一对一

    Belongs To


    Belongs To

    belongs to 会与另一个模型建立了一对一的连接。 这种模型的每一个实例都“属于”另一个模型的一个实例。

    例如,您的应用包含 user 和 company,并且每个 user 都可以分配给一个 company

    // `User` 属于 `Company`,`CompanyID` 是外键
    type User struct {
      gorm.Model
      Name      string
      CompanyID int
      Company   Company
    }
    
    type Company struct {
      ID   int
      Name string
    }

    重写外键

    要定义一个 belongs to 关系,必须存在外键,默认的外键使用拥有者的类型名加上主字段名

    对于上面例子,定义属于 Company 的 User,其外键一般是 CompanyID

    此外,GORM 还提供了一种自定义外键的方法,例如:

    type User struct {
      gorm.Model
      Name         string
      CompanyRefer int
      Company      Company `gorm:"foreignKey:CompanyRefer"`
      // 使用 CompanyRefer 作为外键
    }
    
    type Company struct {
      ID   int
      Name string
    }

    重写引用

    对于 belongs to 关系,GORM 通常使用拥有者的主字段作为外键的值。 对于上面的例子,它是 Company 的 ID 字段

    当您将 user 分配给某个 company 时,GORM 会将 company 的 ID 保存到用户的 CompanyID 字段

    此外,您也可以使用标签 references 手动更改它,例如:

    type User struct {
      gorm.Model
      Name      string
      CompanyID string
      Company   Company `gorm:"references:Code"` // 使用 Code 作为引用
    }
    
    type Company struct {
      ID   int
      Code string
      Name string
    }

    Belongs to 的 CRUD

    查看 关联模式 获取 belongs to 相关的用法

    预加载

    GORM 可以通过 PreloadJoins 预加载 belongs to 关联的记录,查看 预加载 获取详情

    外键约束

    你可以通过为标签 constraint 配置 OnUpdateOnDelete 实现外键约束,在使用 GORM 进行迁移时它会被创建,例如:

    type User struct {
      gorm.Model
      Name      string
      CompanyID int
      Company   Company `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
    }
    
    type Company struct {
      ID   int
      Name string
    }

    Has One


    Has One

    has one 与另一个模型建立一对一的关联,但它和一对一关系有些许不同。 这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。

    例如,您的应用包含 user 和 credit card 模型,且每个 user 只能有一张 credit card。

    // User 有一张 CreditCard,UserID 是外键
    type User struct {
      gorm.Model
      CreditCard CreditCard
    }
    
    type CreditCard struct {
      gorm.Model
      Number string
      UserID uint
    }

    对于 has one 关系,同样必须存在外键字段。拥有者将把属于它的模型的主键保存到这个字段。

    重写外键

    这个字段的名称通常由 has one 模型的类型加上其 主键 生成,对于上面的例子,它是 UserID

    为 user 添加 credit card 时,它会将 user 的 ID 保存到自己的 UserID 字段。

    如果你想要使用另一个字段来保存该关系,你同样可以使用标签 foreignKey 来更改它,例如:

    type User struct {
      gorm.Model
      CreditCard CreditCard `gorm:"foreignKey:UserName"`
      // 使用 UserName 作为外键
    }
    
    type CreditCard struct {
      gorm.Model
      Number   string
      UserName string
    }

    重写引用

    默认情况下,拥有者实体会将 has one 对应模型的主键保存为外键,您也可以修改它,用另一个字段来保存,例如下个这个使用 Name 来保存的例子。

    您可以使用标签 references 来更改它,例如:

    type User struct {
      gorm.Model
      Name       string     `gorm:"index"`
      CreditCard CreditCard `gorm:"foreignkey:UserName;references:name"`
    }
    
    type CreditCard struct {
      gorm.Model
      Number   string
      UserName string
    }

    多态关联

    GORM 为 has one 和 has many 提供了多态关联支持,它会将拥有者实体的表名、主键值都保存到多态类型的字段中。

    type Cat struct {
      ID    int
      Name  string
      Toy   Toy `gorm:"polymorphic:Owner;"`
    }
    
    type Dog struct {
      ID   int
      Name string
      Toy  Toy `gorm:"polymorphic:Owner;"`
    }
    
    type Toy struct {
      ID        int
      Name      string
      OwnerID   int
      OwnerType string
    }
    
    db.Create(&Dog{Name: "dog1", Toy: Toy{Name: "toy1"}})
    // INSERT INTO `dogs` (`name`) VALUES ("dog1")
    // INSERT INTO `toys` (`name`,`owner_id`,`owner_type`) VALUES ("toy1","1","dogs")

    您可以使用标签 polymorphicValue 来更改多态类型的值,例如:

    type Dog struct {
      ID   int
      Name string
      Toy  Toy `gorm:"polymorphic:Owner;polymorphicValue:master"`
    }
    
    type Toy struct {
      ID        int
      Name      string
      OwnerID   int
      OwnerType string
    }
    
    db.Create(&Dog{Name: "dog1", Toy: Toy{Name: "toy1"}})
    // INSERT INTO `dogs` (`name`) VALUES ("dog1")
    // INSERT INTO `toys` (`name`,`owner_id`,`owner_type`) VALUES ("toy1","1","master")

    注意:toys表中并没有产生外键关联,


    Has One 的 CURD

    查看 关联模式 获取 has one 相关的用法

    预加载

    GORM 可以通过 PreloadJoins 预加载 has one 关联的记录,查看 预加载 获取详情

    自引用 Has One

    这里自己引用自己没有产生外键

    type User struct {
      gorm.Model
      Name      string
      ManagerID *uint
      Manager   *User
    }

    外键约束

    你可以通过为标签 constraint 配置 OnUpdateOnDelete 实现外键约束,在使用 GORM 进行迁移时它会被创建,例如:

    type User struct {
      gorm.Model
      CreditCard CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
    }
    
    type CreditCard struct {
      gorm.Model
      Number string
      UserID uint
    }

    你也可以在删除记录时通过 Select 来删除关联的记录,查看 Delete with Select 获取详情



  • 相关阅读:
    SQL查询效率100w数据查询只要1秒
    超级实用且不花哨的js代码大全 (四) JavaScript[对象.属性]集锦
    Sql Server实用操作维护小技巧集合
    asp.net截取字符串方法
    自己整理的asp.net 缓存 相关资料
    【译】初识SSRS 通向报表服务的阶梯系列(一)
    【译】无处不在的数据 通向报表服务的阶梯系列(三)
    【译】SSRS基础 通向报表服务的阶梯系列(二)
    浅谈SQL Server中的事务日志(三)在简单恢复模式下日志的角色
    SQL Server中生成测试数据
  • 原文地址:https://www.cnblogs.com/gjx1212/p/14597415.html
Copyright © 2011-2022 走看看