我正在使用gorm for Go with MySQL驱动程序,这就是我正在尝试做的事情。 这是我的两个结构:
type User struct {
ID uint `gorm:"primary_key"`
Email string `sql:"unique_index;not null;type:varchar(64)"`
Password string `sql:"index;not null;type:varchar(64)"`
Sessions []Session `gorm:"ForeignKey:UserID"`
Roles []Role `gorm:"many2many:users_roles;"`
Level uint `sql:"not null;type:tinyint(1);DEFAULT:1"`
}
type Session struct {
ID uint `gorm:"primary_key"`
SessionID string `sql:"index"`
UserID uint `sql:"index"`
UpdatedAt time.Time
}
从代码中可以看出,结构User
应该与与Sessions有很多关系。
现在让我们假设我在数据库中有一个用户记录,并在sessions表中有一个带有用户ID的会话记录。
我希望能够根据会话ID检索用户数据。也就是说,找到基于SessionID
的会话记录,然后根据该会话的UserID
获取用户信息。
在纯MySQL中,我会这样做:
SELECT
*
FROM
`users
WHERE `id` = (SELECT `user_id` FROM `sessions` WHERE `session_id` = <MY-SESSION-ID> LIMIT 1)
或者我可以通过像这样的连接来做到这一点
SELECT
`u`.*
FROM
`users` `u`
LEFT JOIN `sessions` `s`
ON `s`.`user_id` = `u`.`id`
WHERE
`s`.`session_id` = <MY-SESSION-ID>
GROUP BY `u`.`id`
无论如何,如果不使用原始SQL,我将如何使用gorm?
答案 0 :(得分:1)
你想要的是gorm的预加载功能:http://jinzhu.me/gorm/crud.html#preloading-eager-loading
它能够使用类似于语法的语法过滤子表。