【问题标题】:Accessing column in junction table in GORM在 GORM 中访问联结表中的列
【发布时间】:2021-09-09 15:24:58
【问题描述】:

我有三个表userstodosuser_todos

type User struct {
  ID    uint64
  Email string
  Todos []Todo `gorm:"many2many:user_todos"`
}

type Todo struct {
  ID    uint64
  Title string
}

type UserTodos struct {
  UserID uint64
  TodoID uint64
  Done   bool
}

现在我想让所有用户拥有所有待办事项。 db.Preload("Todos").Find(&users) 做到了这一点。

但是,如果我想获取所有待办事项并查看它们是否已经由用户完成呢?

我尝试创建一个 SQL 视图 checked_todos,它连接 user_todos 表,并将 User 结构中的 Todos 属性与 CheckedTodo 交换,该 CheckedTodo 只是用布尔字段扩展 Todo。预加载永远不会访问正确的表。

在 GORM 文档中找不到任何提示如何访问联结表中的列。

【问题讨论】:

  • 您是否尝试过使用 Gorm join

标签: go many-to-many go-gorm


【解决方案1】:

您也许可以通过custom preloading 实现您想要的。您可能想尝试两个选项:

选项 1

db.Preload("Todos", func(grm *gorm.DB) *gorm.DB {
   return grm.Where("user_todos.done = 1")
}).Find(&users)

选项 2

db.Preload("Todos", func(grm *gorm.DB) *gorm.DB {
   return grm.Joins("INNER JOIN user_todos ON user_todos.todo_id = todos.id AND user_todos.done = 1")
}).Find(&users)

【讨论】:

    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 2020-11-20
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多