GORM递归预加载

时间:2018-05-31 22:00:35

标签: go go-gorm

通过Postgres PointT* pointer_to_point = &(*iter); 驱动程序使用Go 1.10和CockroachDB。

我有一个看起来像这样的GORM模型:

pq

其中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

也就是说,每个用户可以拥有0个或多个封闭用户,并且每个用户可能拥有许多父用户。我试图为每个用户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'"` } 所有封闭的用户,但GORM只预加载第一级。

即:

preload

加载的唯一用户是usr1,usr2,usr4,usr5和usr7。 usr3或usr 6不是。我目前正试图递归强制封闭的用户加载usr1 |-> usr 2 | |->usr3 | |-> usr4 |->usr6 usr5 |->usr7 回调:

AfterFind

但是这会生成以下SQL:

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
}

如果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>')) 不在那里,那么查询将完美无缺。

非常感谢任何想法。

1 个答案:

答案 0 :(得分:0)

我最终分配了存储库,并在line 331删除了callback_query_preload.go。像魅力一样。