GORM Рекурсивная предварительная загрузка - PullRequest
0 голосов
/ 01 июня 2018

Использование Go 1.10 и CockroachDB через драйвер Postgres pq.

У меня есть модель 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 предварительно загружает только первый уровень.

т.е.:

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 = ... не было 'т, запрос будет работать отлично.

Любые идеи будут с благодарностью.

1 Ответ

0 голосов
/ 01 июня 2018

Я закончил разветвление репозитория и удаление callback_query_preload.go в строке 331 .Работает как шарм.

...