Самый идиоматический способ поиска по отношениям в Горм - PullRequest
0 голосов
/ 04 июня 2019

У меня есть поиск комнаты, который требует, чтобы структура комнаты содержала всю структуру пользователя.

type Room struct {
    ID        *int64     `json:"id"`
    CreatedAt *time.Time `json:"created_at,omitempty" gorm:"not null"`
    UpdatedAt *time.Time `json:"updated_at,omitempty"`
    DeletedAt *time.Time `json:"deleted_at,omitempty"`

    User   *User  `json:"user,omitempty"`
    UserID *int64 `json:"user_id,omitempty"`
}

и

type User struct {
    ID        *int64     `json:"id"`
    CreatedAt *time.Time `json:"created_at,omitempty" gorm:"not null"`
    UpdatedAt *time.Time `json:"updated_at,omitempty"`
    DeletedAt *time.Time `json:"deleted_at,omitempty"`

    FirstName *string `json:"first_name,omitempty"`
    LastName  *string `json:"last_name,omitempty"`
}

пока функция поиска выглядит так

func searchRoom(db *gorm.DB, q string) ([]Room, error) {
    q = "%" + q + "%"

    rooms := []Room{}

    db.Preload("User").
        Joins("LEFT JOIN users on rooms.user_id = users.id").
        Where(
            "CONCAT(users.first_name, ' ', users.last_name) LIKE ?",
            q,
        ).
        Find(&rooms)

    return rooms, nil
}

Это работает довольно хорошо, как и ожидалось, однако для меня это выглядит немного неуклюже, я просмотрел документы Gorm, но не нашел ничего другого, что могло бы мне помочь.

Я мог бы использовать метод db.Raw, но он не заполняет структуру пользователя автоматически.

Есть ли лучший способ использовать Gorm и сделать его более производительным?

...