2016-10-10 5 views
0

たとえば、次のようなgormオブジェクトがテーブルにあります。golang gormは、関連テーブルにないものをすべて選択します。

user 
+----+------+ 
| id | name | 
+----+------+ 
| 1 | John | 
+----+------+ 
| 2 | Jane | 
+----+------+ 

phones 
+----+------+ 
| id |number| 
+----+------+ 
| 1 | 0945 | 
+----+------+ 
| 2 | 0950 | 
+----+------+ 
| 3 | 1045 | 
+----+------+ 

user_phones 
+----+-------+--------+ 
| id |user_id|phone_id| 
+----+-------+--------+ 
| 1 | 1  | 1  | 
+----+-------+--------+ 
| 2 | 1  | 2  | 
+----+-------+--------+ 
| 3 | 2  | 3  | 
+----+-------+--------+ 

私は、ユーザーが与えられていないすべての電話を選択したいと思います。

Gdb.Order("id desc").Where("status = ?", true).Find(&phones).Related("UserPhones").Not("UserPhones.User.ID = ?", user.ID) 

私に知らせてくださいモデルの構造体を必要に応じて:!私が試したものthats user_phones.user_id = 1 *携帯電話を選択しますよう 何か。

ご協力ありがとうございます。

答えて

0

これは、gormの関連のではなく、joinを使って動作するようになっています。おそらく慣用的な虫ではないかもしれませんが、私はgormの先進的な関係に決して幸運を祈ることはありません。

Gdb.LogMode(true) 

if err := Gdb.Joins("left join user_phones on phones.id=user_phones.phone_id").Order("id desc").Where("status = ?", true).Not("user_phones.user_id = ?", user.Id).Find(&phones).Error; err != nil { 
    fmt.Printf("%v\n", err) 
} else { 
    fmt.Printf("result = %+v\n", phones) 
} 

これは、次のSQL生成:

SELECT `phones`.* FROM `phones` left join user_phones on phones.id=user_phones.phone_id WHERE (status = 'true') AND NOT (user_phones.user_id = '1') ORDER BY id desc 

、出力を:

result = [{Id:3 Number:1045}] 

それは私が使用してるものだと私はMySQLを使用しますが、私はsqliteのビーイングを見ることができません任意の異なる。

+0

私は結果として何も得られませんでしたが、ID 3の電話機エントリが必要でした。 – user1644033

+0

ログ/エラーチェックで自分の回答を更新しました。もう一度やり直せますか? –

+0

ああ私はいくつかの場所が必要でした。どこか( "user_phones.idがnull"です)。 :) – user1644033

関連する問題