go - GORM 递归预加载
问题描述
pq
通过 Postgres驱动程序使用 Go 1.10 和 CockroachDB 。
我有一个看起来像这样的 GORM 模型:
type User struct {
ID string `gorm:"type:UUID;primary_key;NOT_NULL"`
UserName string
... <other misc things here>
EnclosedUsers []User `gorm:"many2many:enclosed_user;jointable_foreignkey:parent_id;association_jointable_foreignkey:child_id"`
}
在哪里ecnlosed_user
(特别定义是因为原因:))
type EnclosedUsers struct {
ParentID string `gorm:"type:UUID;default:'00000000-0000-0000-0000-000000000000'"`
ChildID string `gorm:"type:UUID;default:'00000000-0000-0000-0000-000000000000'"`
}
即每个用户可以有0个或多个封闭用户,每个用户可以有多个父用户。我试图preload
为每个用户提供所有封闭的用户,但是 GORM 只预加载第一级。
IE:
usr1
|-> usr 2
| |->usr3
|
|-> usr4
|->usr6
usr5
|->usr7
加载的唯一用户是 usr1、usr2、usr4、usr5 和 usr7。usr3 或 usr 6 不是。我目前正在尝试以递归方式强制封闭的用户加载AfterFind
回调:
func (u *User) AfterFind(scope *gorm.Scope, role *CRRole) error {
var childUsers []User
if err := scope.DB().Model(&u).Related(&childUsers, "EnclosedUsers").Error; err != nil {
return err
}
role.EnclosedRoles = childRoles
return nil
}
但是,这会生成以下 SQL:
SELECT "users".* FROM "users" INNER JOIN "enclosed_users" ON "enclosed_users"."child_id" = "enclosed_users"."id" WHERE (user_name = 'test user 1') AND ("enclosed_users"."parent_id" IN ('<UUID HERE>'))
如果user_name = ...
不存在,则查询将完美运行。
任何想法将不胜感激。
解决方案
我最终callback_query_preload.go
在第 331 行分叉存储库并删除。奇迹般有效。
推荐阅读
- wpf - 旋转大元素以适合 WPF 中的较小容器
- c# - C#如何正确编码可重用类?
- python - Azure 机器学习笔记本上的错误:DataFrame 的真值不明确
- android - 应用清单中的 URI 方案未正确设置
- c++ - 关闭时销毁无模式 wxDialog
- c# - 格式化本地化日期时间 C#
- ckeditor4.x - CKEditor 为每个工具栏实例设置不同的 format_tags
- python - Pandas iloc & loc & 多索引
- openshift - openshift 4:nfs 和块存储的区别
- postgresql - 在 psql 命令中使用 select 语句时出错