gorm: присоединяйтесь к изменяемым условиям «где» - PullRequest
1 голос
/ 02 мая 2019

У меня есть 2 таблицы: актеры и фильмы. Мне нужно получить актеров со всеми их фильмами с помощью сменных фильтров - они могут присутствовать или отсутствовать, одно значение или часть возможных значений.

Я подозреваю, что способ, которым я сделал это (с объектом db), пахнет плохо.

Есть предложения?

var (
            orderBy string
            count   uint
            where   = map[string]interface{}{}
            data    []ActorsWithFilms
            db      = ms.db.Table("actor")
        )

        if filter.ActorName != "" {
            where["actor_name"] = filter.ActorName
        }

        if filter.UpdatedFrom != "" {
            db = db.Where("actor.updated_at >= ?", filter.UpdatedFrom)
        }

        if len(filter.FilmNames) != 0 {
            db = db.Where("film.name in (?)", filter.FilmNames)
        }

        if len(filter.Statuses) != 0 {
            db = db.Where("actor.status in (?)", filter.Statuses)
        }

        err := db.
            Joins("join film on film.actorID = actor.id").
            Where(where).
            Preload("Film").
            Order(orderBy).
            Limit(filter.GetLimit()).
            Offset(filter.Offset).
            Find(&data).
            Count(&count).
            Error

1 Ответ

0 голосов
/ 03 мая 2019

Это на самом деле не выглядит плохо для меня. Горм представляет интерфейс цепочки методов именно для того, чтобы вы могли выполнять построение запросов следующим образом, так что я бы не сказал, что это вообще запах кода.

...