登录
首页 >  Golang >  Go问答

Many2Many JoinTable 中的自定义字段

来源:stackoverflow

时间:2024-04-17 21:30:35 428浏览 收藏

珍惜时间,勤奋学习!今天给大家带来《Many2Many JoinTable 中的自定义字段》,正文内容主要涉及到等等,如果你正在学习Golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容

我有一个带有自定义 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
}

创建新的 person 时如何为 home 字段赋值?


解决方案


方法1

从我在文档中看到的内容来看,这是您当前可以执行此操作的一种干净方法:

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)

方法2

这里有一个更神奇的方法,除了上面的 setupjointable 代码之外,还可以使用 context 将值传递给 beforesave 挂钩:

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)

我觉得这个方法很恶心,但它确实有效。

终于介绍完啦!小伙伴们,这篇关于《Many2Many JoinTable 中的自定义字段》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>