При желании применять .Where () к gorm.DB - PullRequest
0 голосов
/ 30 апреля 2019

Я новичок в Go, и мои знания указателя ржавые. Я хочу изменить экземпляр gorm.DB, чтобы я мог применить к нему 0 или более предложений Where.

func () {
    db := gorm.Open(/* ... */)
    err := applyWhere(db, filters).Order("created_datetime desc").Find(&rMessages).Error
    // ...
}

func applyWhere(db *gorm.DB, filters Filters) *gorm.DB {
    if filters.MessageType != "" {
        db = db.Where(&message{MessageType: string(filters.MessageType)})
    }
    return db
}

Кажется, это не работает. Экземпляр базы данных не имеет примененного где.

* редактировать 3 *

Теперь это работает. Не уверен, что проблема была раньше. Пожалуйста, закройте / удалите этот вопрос.

1 Ответ

1 голос
/ 30 апреля 2019

Прочтите о том, как правильно создать цепочку с GORM здесь: Учебник по методике цепочки . Вы берете *gorm.DB, возвращенный одним методом, и применяете другой метод, вот и все. Вы также можете передать *gorm.DB, но будьте осторожны, чтобы только передать указатель, а не разыменовать его (в противном случае вы получите ошибку блокировки копирования, как вы обнаружили).

Order s - это просто еще один вид запроса, который вы можете объединить в цепочку: http://gorm.io/docs/query.html#Order

Например:

var p Product
db.Order("Price").Where("Price > 1000").First(&p)

Так что ваш applyWhere должен просто вернуть *gorm.DB, который вы можете запросить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...