У меня есть поиск комнаты, который требует, чтобы структура комнаты содержала всю структуру пользователя.
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 и сделать его более производительным?