Golang Gorm имеет (как в Laravel) метод эквивалентен? - PullRequest
0 голосов
/ 13 февраля 2019

Есть ли способ сказать gorm, чтобы он выбирал только те строки (Attractions), которые имеют отношение hasOne (AttractionsData)?Так же, как я использовал бы ":: has ('lativeName)" в Laravel?Следующий код вернет коллекцию, включая Достопримечательности с пустым отношением, вместо того, чтобы пропускать их

type Attractions struct {
    ID              uint              `gorm:"primary_key"`
    ...
    Active                int       `json:"-"`
    AttractionsData AttractionsData `gorm:"foreignkey:AttractionID"`
}
type AttractionsData struct {
    ID                    uint      `gorm:"primary_key"`
    AttractionID          uint      `json:"-"`
    Lang                  string    `json:"lang"`
    Title                 string    `json:"title"`
    Active                int       `json:"-"`
}
    ...
func someFunc(c *gin.Context){
    ...
    db := config.DBConnect()
    defer db.Close()    
    var atts []Attractions
    db.Preload("AttractionsData", "lang = ? AND active = ?", lang, 1).
            Where("country_id = ?", countryID).
            Where("category_id = ?", categoryID).
            Where("active = ?", 1).
            Find(&atts) 
    ...

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я бы сначала получил нужные вам идентификаторы:

ids := []int{}
db.Model(&AttractionData{}).
   Where("lang = ? AND active = ?", lang, 1).
   Pluck("attraction_id", &ids)
db.Preload("AttractionsData").
   Where("id IN (?)", ids).
   Where("category_id = ?", categoryID).
   Where("active = ?", 1).
   Find(&atts) 
0 голосов
/ 13 февраля 2019

этот код, кажется, работает для меня.Использование LEFT JOIN и WHERE отфильтрует нежелательные аттракционы.Хотя в надежде получить более элегантное решение.

...
db.Joins("LEFT JOIN attractions_data ON attractions_data.attraction_id = attractions.id").
    Preload("AttractionsData", "lang = ? AND active = ?", lang, 1).
    Where("attractions.country_id = ?", countryID).
    Where("attractions.category_id = ?", categoryID).
    Where("attractions.active = ?", 1).
    Where("attractions_data.active = ? AND attractions_data.lang = ?", 1,lang).
    Find(&atts) 
...