Как выбрать по полям в предварительно загруженном объекте?

#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)
  

Я надеюсь, что это решит вашу проблему.