2015-03-13 49 views
1

玩GO/Beego Framework並嘗試查詢數據庫以將一些記錄加載到結構中。如何將數據庫記錄加載到子結構中?

貝婁是重要的代碼:

type User struct { 
    UserId int64 `orm:"pk"` 
    FirstName string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    LastName string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    Email string `valid:"Required;MinSize(2);MaxSize(150);Email" required:"true" description:"user email address"` 
    Password string `valid:"Required;MaxSize(60)" required:"true" description:"user plain text password" json:"-"` 
    AccessLevel uint64 `json:"-"` 
    AuthKey string `json:"-"` 
    Status int `json:"-"` 
    DateAdded time.Time `orm:"-" json:"-"` 
    LastUpdated time.Time `orm:"-" json:"-"` 

    // relations 
    Profile *UserProfile `orm:"rel(one)" json:"-"` // OneToOne relation 
} 

type UserProfile struct { 
    UserId int64 `orm:"pk"` // doesn't work without a PK, doesn't make sense, it's a fk... 
    Company string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    VatNumber string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    Website string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    Phone string `orm:"null" valid:"MinSize(2);MaxSize(150);Mobile"` 
    Address1 string `orm:"null" valid:"MinSize(2);MaxSize(255)"` 
    Address2 string `orm:"null" valid:"MinSize(2);MaxSize(255)"` 
    City string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    State string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    Zip string `orm:"null" valid:"MinSize(4);MaxSize(15)"` 
    Country string `orm:"null" valid:"MinSize(2);MaxSize(150)"` 
    ConfirmationKey string `orm:"null" valid:"Length(40)" json:"-"` 

    // relations 
    User *User `orm:"reverse(one)" json:"-"` // Reverse relationship (optional) 
} 

func GetAllUsers() []User { 
    o := orm.NewOrm() 
    var users []User 
    sql := ` 
    SELECT user.*, user_profile.* 
     FROM user 
     INNER JOIN user_profile ON user_profile.user_id = user.user_id 
    WHERE 1` 
    _, err := o.Raw(sql).QueryRows(&users) 
    if err != nil { 
     beego.Error(err) 
    } 
    beego.Info(users) 
    return users 
} 

現在上面的是,在調用時GetAllUsers()User嵌入結構,即Profile,沒有得到填充了問題,所以如何將我去,這樣嵌入結構也填充?

我也試圖用得到的用戶:

o.QueryTable("user").Filter("status", STATUS_ACTIVE).RelatedSel("Profile").All(&users) 

其產生的SQL查詢,如:

SELECT T0.`user_id`, T0.`first_name`, T0.`last_name`, T0.`email`, T0.`password`, T0.`access_level`, T0.`auth_key`, T0.`status`, T0.`profile_id`, T1.`user_id`, T1.`company`, T1.`vat_number`, T1.`website`, T1.`phone`, T1.`address1`, T1.`address2`, T1.`city`, T1.`state`, T1.`zip`, T1.`country`, T1.`confirmation_key` FROM `user` T0 INNER JOIN `user_profile` T1 ON T1.`user_id` = T0.`profile_id` WHERE T0.`status` = ? LIMIT 1000 

而且我不從那裏想出了加入上知道profile_id列,因爲它甚至不存在,我不知道如何指定正確的列加入,似乎它從結構名稱。另外,我不喜歡這樣的事實,即沒有辦法指定要選擇的內容。

任何提示高度讚賞,我相信這是簡單的,我想念。

謝謝。

+0

或許正是由於削減正粘貼到SO,但請['gofmt'所有Go代碼(HTTPS ://blog.golang.org/go-fmt-your-code)。在這種情況下,它會使得類型定義更易於閱讀。 – 2015-04-23 17:20:56

回答

1

https://github.com/astaxie/beego/issues/384具有相對的談話,但它的Chinese.The關鍵是下面:

type User struct { 
    Id int 
    Name string 
} 

type Profile struct { 
    Id int 
    Age int 
} 

var users []*User 
var profiles []*Profile 
err := o.Raw(`SELECT id, name, p.id, p.age FROM user 
    LEFT OUTER JOIN profile AS p ON p.id = profile_id WHERE id = ?`, 1).QueryRows(&users, &profiles) 
相關問題