PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Obter objeto aninhado na estrutura em gorm


Parece que você vai querer fazer duas coisas com o que você tem:(1) atualizar o modelo para que você tenha o relacionamento correto e (2) usar o .Preload() se você estiver tentando fazer com que ele associe os dados na leitura.

Mudanças de modelo

Gorm automaticamente infere relacionamentos com base no nome dos atributos em seu struct e no nome do struct referenciado. O problema é que o Google atributo do tipo GoogleAccount não está associando porque o gorm está procurando por um type Google struct .

Também está faltando uma chave estrangeira na GoogleAccount . Como o ORM saberia qual GoogleAccount associar a qual Client ? Você deve adicionar um ClientId para sua GoogleAccount definição de estrutura.

Além disso, eu mudaria as chaves primárias que você está usando para digitar uint já que é isso que o gorm assume (a menos que você tenha uma boa razão para não usá-lo)

Se eu fosse você, mudaria minhas definições de struct para o seguinte:
type Client struct {
     IdClient       uint            `gorm:"primary_key"`
     Name           string
     PhotoUrl       string
     ApprovalNumber uint16
     Phone          string
     Password       string
     HoursOfNotice  int8
     GoogleAccount  GoogleAccount    // Change this to `GoogleAccount`, the same name of your struct
}

type GoogleAccount struct {
     Id             uint
     ClientId       uint             // Foreign key
     Token          string
}

Para obter mais informações sobre isso, dê uma olhada na documentação das associações aqui:http://gorm. io/associations.html#has-one

Pré-carregando associações

Agora que você realmente os relaciona corretamente, você pode .Preload() obtenha o objeto aninhado que você deseja:
db.Preload("GoogleAccount").First(&user)

Usando .Preload() preencherá a user.GoogleAccount atributo com a GoogleAccount associada corretamente com base no ClientId .

Para obter mais informações sobre isso, dê uma olhada na documentação de pré-carregamento:http://gorm .io/crud.html#preloading-eager-loading