Select 所有不相关的 table
Select all which not in related table
例如,我在表中有以下 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 |
+----+-------+--------+
对于 gorm 我想要 select 所有没有给用户的电话。
类似于:select * phones where user_phones.user_id != 1
那就是我试过的:
Gdb.Order("id desc").Where("status = ?", true).Find(&phones).Related("UserPhones").Not("UserPhones.User.ID = ?", user.ID)
我使用 join 而不是 gorm 的 related 让这个工作。也许不是惯用的 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 有什么不同。
例如,我在表中有以下 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 |
+----+-------+--------+
对于 gorm 我想要 select 所有没有给用户的电话。 类似于:select * phones where user_phones.user_id != 1 那就是我试过的:
Gdb.Order("id desc").Where("status = ?", true).Find(&phones).Related("UserPhones").Not("UserPhones.User.ID = ?", user.ID)
我使用 join 而不是 gorm 的 related 让这个工作。也许不是惯用的 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 有什么不同。