2017-12-05 15 views
0

私はGo for MySQLドライバーでgormを使用しています。ここで私がやろうとしていることがあります。ここで は私の2つの構造体です:構造ユーザー - セッションが多数あります。セッションを与えられたユーザーを見つけよう

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がセッションを持つ多くの関係を持って持つようになっています。

ここでは、データベースにユーザーレコードがあり、ユーザーのIDを持つセッションテーブルにセッションレコードがあるとします。 私は、セッションIDに基づいてユーザーデータを取得できるようにしたいと思います。つまり、SessionIDに基づいてセッションレコードを探し、そのセッションのUserIDに基づいてユーザー情報を取得します。純粋なMySQLで

、私はこのようにそれを行うだろう:

SELECT 
    * 
FROM 
    `users 
WHERE `id` = (SELECT `user_id` FROM `sessions` WHERE `session_id` = <MY-SESSION-ID> LIMIT 1) 

それとも私はせずにGORMでそれを行うだろうか、とにかくこの

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に頼っていますか? http://jinzhu.me/gorm/crud.html#preloading-eager-loading

それはどこのような構文で子テーブルをフィルタリングする機能を持っている:あなたが欲しい

+1

「生のSQLに頼らずに、どうやってガンマでやっていますか?」 - これがORMを避ける理由です。あなたは彼らと一緒に働くよりも、彼らの周りに働く時間を費やします。 – Flimzy

答えて

1

はGORMのプリロード機能です。

+0

プリロードを試しましたが、動作しないようです。それはすべてのユーザーのすべてのセッションをプリロードしますが、返されるユーザーを制限することはできません。 解決策:「関連する」作業は何ですか? db.First(&mySessionObj、&Session {SessionID: "Some ID"})。関連(&myUserObj) – Northern