首页 > 解决方案 > 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 = ...不存在,则查询将完美运行。

任何想法将不胜感激。

标签: gogo-gorm

解决方案


我最终callback_query_preload.go第 331 行分叉存储库并删除。奇迹般有效。


推荐阅读