关联模式

创建时自动保存关联

user := User{
  Name:            "jinzhu",
  BillingAddress:  Address{Address1: "Billing Address - Address 1"},
  ShippingAddress: Address{Address1: "Shipping Address - Address 1"},
  Emails:          []Email{
    {Email: "jinzhu@example.com"},
    {Email: "jinzhu-2@example.com"},
  },
  Languages:       []Language{
    {Name: "ZH"},
    {Name: "EN"},
  },
}

// Creating a user along with its associated addresses, emails, and languages
db.Create(&user)
// BEGIN TRANSACTION;
// INSERT INTO "addresses" (address1) VALUES ("Billing Address - Address 1"), ("Shipping Address - Address 1") ON DUPLICATE KEY DO NOTHING;
// INSERT INTO "users" (name,billing_address_id,shipping_address_id) VALUES ("jinzhu", 1, 2);
// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu@example.com"), (111, "jinzhu-2@example.com") ON DUPLICATE KEY DO NOTHING;
// INSERT INTO "languages" ("name") VALUES ('ZH'), ('EN') ON DUPLICATE KEY DO NOTHING;
// INSERT INTO "user_languages" ("user_id","language_id") VALUES (111, 1), (111, 2) ON DUPLICATE KEY DO NOTHING;
// COMMIT;

db.Save(&user)

使用 FullSaveAssociations 更新关联

对于需要完全更新关联数据(而不仅仅是外键引用)的情况,应该使用 FullSaveAssociations 模式。

使用 FullSaveAssociations 可确保模型的整个状态(包括其所有关联)反映在数据库中,从而维护整个应用程序的数据完整性和一致性。

特性

使用 FullSaveAssociations

直接更新

​关联处理​

自动保存所有嵌套关联

只更新主模型,忽略关联

​零值处理​

更新所有字段(包括零值)

默认忽略零值

​创建/更新​

自动判断创建或更新关联

需要手动处理关联

​性能影响​

可能产生多个 SQL 操作

单个 SQL 操作

跳过自动更新

GORM 提供了灵活性,可以在创建或更新操作期间跳过关联的自动保存。这可以通过使用 SelectOmit 方法来实现,它们允许您精确指定在操作中应包含或排除哪些字段或关联。

使用Select包含特定字段

Select 方法允许您指定要保存模型的哪些字段。这意味着只有选定的字段才会包含在 SQL 操作中。

使用 Omit 来排除字段或关联

相反, Omit 允许您在保存模型时排除某些字段或关联。

对于多对多关联,GORM 会在创建连接表引用之前更新关联。要跳过此更新操作,请使用 Omit 并在关联名称后加 .* :

要跳过创建关联及其引用:

删除关联

GORM 允许在删除主记录时使用 Select 方法删除特定的关联关系(例如,一对多、多对多)。此功能对于维护数据库完整性以及确保在删除时对关联数据进行适当的管理特别有用。

需要注意的是,只有当删除记录的主键不为零时,关联才会被删除。GORM 使用这些主键作为条件来删除选定的关联。

关联模式

要启动关联模式,请指定源模型和关系的字段名称。源模型必须包含主键,并且关系的字段名称应与现有关联匹配。关联模式就是让 GORM 自动帮你处理数据表之间的关系​​,比如用户和订单、文章和标签等关系。

寻找关联

检索有或无附加条件的相关记录。

附加关联

many to manyhas many 添加新关联,或为 has onebelongs to 替换当前关联。

删除关联记录

关联标签

GORM 中的关联标签用于指定如何处理模型之间的关联。这些标签定义了关系的详细信息,例如外键、引用和约束。理解这些标签对于有效地设置和管理关系至关重要。

Tag  标签
Description  描述

foreignKey

指定当前模型中用作连接表中外键的列名。

references

指示连接表的外键映射到的引用表中的列名。

polymorphic

定义多态类型,通常是模型名称。

polymorphicValue

如果没有特别指定,则设置多态值,通常是表名。

many2many

命名多对多关系中使用的连接表。

joinForeignKey

标识连接表中映射回当前模型表的外键列。

joinReferences

指向与参考模型表相链接的连接表中的外键列。

constraint

为关联指定关系约束,如 OnUpdateOnDelete

最后更新于