结构用户 - 有很多会话。查找给定会话的用户

Struct user - has many sessions. Find a user given a session

我将 gorm 与 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 应该与会话有 很多 关系。

现在假设我在数据库中有一条用户记录,在会话 table 中有一条带有用户 ID 的会话记录。 我希望能够根据会话 ID 检索用户数据。即根据SessionID找到一条session记录,然后根据该session的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 来做到这一点?

你想要的是gorm的预加载功能:http://jinzhu.me/gorm/crud.html#preloading-eager-loading

它能够使用类似 where 的语法过滤子 table。