首页 > 解决方案 > 在 GORM 中访问联结表中的列

问题描述

我有三张桌子userstodos并且user_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)这样做的伎俩。

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

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

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

标签: gomany-to-manygo-gorm

解决方案


您可以通过自定义预加载来实现您想要的。您可能想尝试两个选项:

选项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)

推荐阅读