mysql - Many2Many JoinTable 中的自定义字段
问题描述
我有一个带有自定义 JoinTable 的模型:
type Person struct {
ID int
Name string
Addresses []Address `gorm:"many2many:person_addresses;"`
}
type Address struct {
ID uint
Name string
}
type PersonAddress struct {
PersonID int
AddressID int
Home bool
CreatedAt time.Time
DeletedAt gorm.DeletedAt
}
Home
创建新字段时如何为字段赋值Person
?
解决方案
方法一
从我在文档中看到的内容来看,这是您目前可能执行此操作的一种干净方式:
DB.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})
addr1 := Address{Name: "addr1"}
DB.Create(&addr1)
addr2 := Address{Name: "addr2"}
DB.Create(&addr2)
person := Person{Name: "jinzhu"}
DB.Create(&person)
// Add an association with default values (i.e. Home = false)
DB.Model(&person).Association("Addresses").Append(&addr1)
// Add an association with custom values
DB.Create(&PersonAddress{
PersonID: person.ID,
AddressID: addr2.ID,
Home: true,
})
在这里,我们使用实际的连接表模型来插入包含我们想要的值的行。
我们还可以过滤关联查询:
addr := Address{}
// Query association with filters on join table
DB.Where("person_addresses.home = true").
Model(&person).
Association("Addresses").
Find(&addr)
方法二
除了上面的代码之外,这是一种更神奇的方式,通过(ab)使用Context
将值传递给钩子:BeforeSave
SetupJoinTable
func (pa *PersonAddress) BeforeSave(tx *gorm.DB) error {
home, ok := tx.Statement.Context.Value("home").(bool)
if ok {
pa.Home = home
}
return nil
}
// ...
DB.WithContext(context.WithValue(context.Background(), "home", true)).
Model(&person).
Association("Addresses").
Append(&addr2)
这种方法对我来说感觉很恶心,但它确实有效。
推荐阅读
- angular - 在来自数组的按钮的 ngFor 循环中生成不同的(单击)属性
- amazon-web-services - 难以理解 AWS cloudwatch 警报
- javascript - 使用 JQuery 从串联输入值的字符串中搜索并返回 JSON 文件值
- angular - 访问被 CORS 策略阻止:对预检请求的响应未通过访问控制检查
- kubernetes - Kubernetes 在使用 Helm 安装包时请求凭据
- javascript - 为什么当我触发函数时输入类型=数值为空
- html - 检查是否在 Div 区域内 onclick 事件
- swift - 使用 SwiftUI 呈现 ActionSheet 的正确方法
- c - 关于删除/替换结构
- regex - 正则表达式匹配日志文件中的 url 给出了行继续错误 - 我需要转义什么?