2016-10-10 81 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  | 
+----+-------+--------+ 

随着格姆我想选择所有没有给予用户的手机。 喜欢的东西:SELECT *手机,其中user_phones.user_id = 1 那是我的尝试:

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

如果需要的模型结构,请让我知道。

感谢您的帮助。

回答

0

我得到这个工作使用一个加入而不是格姆的相关。也许不是习惯性的格言,但我从来没有对格言中的高级关系有任何的运气。

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

啊,我需要更多的地方.Where(“user_phones.id为空”)。 :) – user1644033