登录
首页 >  Golang >  Go问答

访问 GORM 中联结表中的列

来源:stackoverflow

时间:2024-03-17 14:15:28 363浏览 收藏

在 GORM 中,可以通过自定义预加载功能访问联结表中的列。联结表包含有关两个或多个表之间关系的信息。通过预加载,可以在查询用户时同时加载其关联的待办事项。但是,如果需要检查用户是否已完成这些待办事项,则需要在预加载查询中指定条件。有两种方法可以实现此目的:1)使用 where 子句过滤已完成的待办事项;2)使用 JOIN 子句连接 user_todos 表并指定已完成的条件。

问题内容

我有三个表 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 交换,后者仅扩展了 todozqben带有布尔字段的 dczqb。预加载永远不会访问正确的表。

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


正确答案


您也许可以通过 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)

今天关于《访问 GORM 中联结表中的列》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

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