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

С gorm Я бы хотел выбрать все телефоны, которые не заданы пользователем. Что-то вроде: SELECT * телефонов, где user_phones.user_id = 1 То, что я пробовал:

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

Если нужны модели, пожалуйста, дайте структуры мне знать.

Благодарим за любую помощь.

ответ

0

Я получил это, чтобы работать с использованием соединения, а не gorm's , связанного с. Возможно, это не идиоматическая грань, но мне никогда не удастся с передовыми отношениями в 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

Большое спасибо за это, но я ничего не получил в результате, но мне понадобился номер телефона с идентификатором 3. – user1644033

+0

Я обновил свой ответ с помощью регистрации/проверки ошибок - можете ли вы попробовать еще раз? –

+0

Ahh Мне нужно еще кое-где. Где ("user_phones.id is null"). :) – user1644033