#go #go-gorm
#Вперед #go-gorm
Вопрос:
Интересно, можно ли выбрать по условию в предварительно загруженном объекте. Например, у меня есть таблицы User и Profile (один к одному). Итак, мне нужно получить всех пользователей с профилями, где пол женский.
Я думал, что это можно сделать примерно так:
Preload("UserProfile").Where("user_profile.sex = ?", "female")
Но он возвращает что-то вроде:
pq: отсутствует запись в предложении для таблицы «user_profile «
Комментарии:
1. Я полагаю, что таблица на самом деле вызывается
user_profiles
2. Я обнаружил, что мне нужно использовать соединения: Соединения («слева присоединиться к trade_items на trade_items.id = trade_requests.trade_item_id»), а затем где («trade_items.request_type = ?», «ПРОДАТЬ»)
Ответ №1:
Предварительная загрузка не присоединяется к указанным таблицам. Вам необходимо явно присоединиться к рассматриваемой таблице:
Preload("UserProfile").Joins("LEFT JOIN user_profile ON user.id = user_profile.user_id")
.Where("user_profile.sex = ?", "female")
… Предполагая, что ваш первичный ключ вызывается id
, и вызывается внешний ключ user_id
.
Ответ №2:
Я также столкнулся с той же проблемой в недавнем проекте. Я нашел, что приведенное ниже решение работает для меня.
var users []User
Preload("UserProfile","sex = ?","female").Find(amp;users)
а затем проверьте наличие
user.profile!=nil
Проблема в этом подходе заключается в том, что он будет загружать всех пользователей.
Но в вашем случае это может быть по-другому.
var profiles []Profile
Preload("User").where("sex = ?","female").Find(amp;profiles)
Я надеюсь, что это решит вашу проблему.