go - 在 GORM 中访问联结表中的列
问题描述
我有三张桌子users
,todos
并且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
中的属性,它只是扩展了一个布尔字段。预加载永远不会访问正确的表。User
CheckedTodo
Todo
在 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)
推荐阅读
- unity3d - 如何在 Unity 中将 VR 按钮与 PUN 联网?
- python - SQLITE3 - 如何根据输入的数据自动检测数据库中的表?
- java - 在android studio中添加多个执行点击
- javascript - 连接 JSON API 进行解析
- input - 从输出html中删除了工具提示弹出框内的引导输入字段
- powershell - 我无法通过 powershell 修改 AD 用户自定义属性
- php - 回显 URL 包括主机域名
- python - Python 等效于 MATLAB 的“bitrevorder”函数
- javascript - Vue.js 在实例内添加事件监听器?
- scala - 如果有任何死代码或未使用的导入、变量等,如何编译失败