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