golang gorm选择所有不在相关表格中的

时间:2016-10-10 18:50:27

标签: sqlite go go-gorm

例如我在表格中有以下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 * phones其中user_phones.user_id!= 1 那是我尝试过的:

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

如果需要,模型结构请告诉我。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我使用连接而不是gorm的相关来实现此功能。也许不是习惯性的规范,但我从来没有对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有什么不同。