2016-04-05 14 views
0

当使用 “默认” 主键的命名约定:GO GORM .Related()构造不与非默认主键名一起使用。

在Postgres表

CREATE TABLE person 
(
    id SERIAL, 
    name varchar(255) NOT NULL, 
    CONSTRAINT person_pk PRIMARY KEY (id) 
) 


CREATE TABLE email 
(
    id SERIAL, 
    person_id int NOT NULL REFERENCES person(id), 
    CONSTRAINT email_pk PRIMARY KEY (id) 
) 

此。相关()构建工作正常每例子:

type Person struct { 
    ID int 
    Name string 
    Emails []Email 
} 

type Email struct { 
    ID  int 
    PersonID int 
} 
person := models.Person{} 
conn.DB.First(&person).Related(&person.Emails) 

但使用非时默认主键名称,该示例不起作用。无论有多少电子邮件,只会向电子邮件添加一封电子邮件。

CREATE TABLE person 
(
    person_id SERIAL, 
    name varchar(255) NOT NULL, 
    CONSTRAINT person_pk PRIMARY KEY (person_id) 
) 

CREATE TABLE email 
(
    email_id SERIAL, 
    person_id int NOT NULL REFERENCES person(person_id), 
    CONSTRAINT email_pk PRIMARY KEY (email_id) 
) 


type Person struct { 
    PersonId int `gorm:"primary_key"` 
    Name  string 
    Emails []Email `gorm:"ForeignKey:PersonId"` 
} 

type Email struct { 
    EmailId int `gorm:"primary_key"` 
    PersonId int 
} 

person := models.Person{} 
conn.DB.First(&person).Related(&person.Emails) 

我不得不求助于使用此结构:

person := models.Person{} 
conn.DB.First(&person) 
conn.DB.Where("person_id = ?", person.PersonId).Find(&person.Emails) 

是否有可能作出。相关()工作在这种情况下?

回答

0

发现此问题。以下是已纠正的结构:

type Person struct { 
    PersonId int `gorm:"primary_key"` 
    Name  string 
    Emails []Email `gorm:"ForeignKey:PersonRefer"` 
} 

type Email struct { 
    EmailId  int `gorm:"primary_key"` 
    Person  Person 
    PersonRefer int `gorm:"column:person_id"` 
} 

conn.DB.First(&person).Related(&person.Emails, "PersonRefer")