Gorm: Проблема с Find () и First ()

Созданный на 22 нояб. 2014  ·  3Комментарии  ·  Источник: go-gorm/gorm

Я не уверен, связана ли эта проблема с вашим кодом или документацией.
Я также предполагаю, что вы разработали GORM на основе Ruby On Rails или PHP-Laravel, поэтому я считаю, что это ошибка.

http://laravel.com/docs/4.2/eloquent

Я не ожидаю, что вы согласитесь со всеми моими предложениями, потому что вы пытаетесь заставить Find () и First () выполнять 4 команды в Laravel: All (), First (), Find (), Get ().

Но обратная сторона - то, что ваш метод ВСЕГДА возвращает срез, даже если удобнее получить одну структуру (без среза), когда вы ХОТИТЕ и ОЖИДАЕТЕ один результат.

Самый полезный комментарий

Привет @pjebs

Хотя я позаимствовал идеи из ActiveRecord, он работает не совсем так, как показано ниже:

db.First(&User{})   // first user, sort by primary key
db.First(&[]User{}) // find the first user, and put it into the array

db.Find(&User{})   // first user
db.Find(&[]User{}) // find all users

// find records with conditions
db.First(&User{}, 123)
db.First(&User{}, "name = ?", "hello")
db.Find(&User{}, "name = ?", "hello")
db.Where("name = ?", "hello").First(&User{})
db.Where("name = ?", "hello").Find(&User{})

Все 3 Комментарий

type Customer struct {
Id uint32 gorm:"column:id; primary_key:yes"
Строка Access_token gorm:"column:access_token"
}

func (c Customer) TableName () string {
вернуть «клиентов»
}

func MyMiddleware (rw http.ResponseWriter, r * http.Request) {
// u: = [] Клиент {}
u: = & Клиент {}

db, _ := gorm.Open("mysql", "root:@/main")
// db.First(&u, 5)
// db.First(&u)
// db.Find(&u, 5)
db.Find(&u)

}

Это проблема:

ПЕРВАЯ КОМАНДА:
Это должно вернуть первый результат из коллекции всех возвращаемых результатов. (есть ли дополнительные параметры WHERE или нет).
Он должен анализировать ОДИН результат в & Customer {} и НЕ иметь там массива с одним результатом.

В настоящее время это не работает, если & u не является ссылкой на срез. & u должен указывать на & Customer {}, а не на & [] Customer {}.

Эта функция также НИКОГДА не должна принимать дополнительный параметр для первичного ключа. Для этого и предназначена функция НАЙТИ.

НАЙТИ КОМАНДУ:
Когда команде «Найти» дается первичный ключ, она не должна возвращать срез. Он также должен ВСЕГДА ожидать значение первичного ключа.

Если вам нужны все значения, используйте КОМАНДУ «ВСЕ». db.ALL (& u) где & u = [] Клиент {}

http://daylerees.com/codebright/eloquent-queries
http://laravel.com/docs/4.2/queries

ВСЕ КОМАНДЫ:
Это должно быть включено в вашу библиотеку. Это вернет все значения.

db.All (& u), где & u = [] Customer {}

ПОЛУЧИТЬ КОМАНДУ:
Это должно быть включено в вашу библиотеку. Это вернет ARRAY всех значений, в том числе после того, как вы установили ограничения WHERE.

Привет @pjebs

Хотя я позаимствовал идеи из ActiveRecord, он работает не совсем так, как показано ниже:

db.First(&User{})   // first user, sort by primary key
db.First(&[]User{}) // find the first user, and put it into the array

db.Find(&User{})   // first user
db.Find(&[]User{}) // find all users

// find records with conditions
db.First(&User{}, 123)
db.First(&User{}, "name = ?", "hello")
db.Find(&User{}, "name = ?", "hello")
db.Where("name = ?", "hello").First(&User{})
db.Where("name = ?", "hello").Find(&User{})
Была ли эта страница полезной?
0 / 5 - 0 рейтинги