Gorm: Problem mit Find() und First()

Erstellt am 22. Nov. 2014  ·  3Kommentare  ·  Quelle: go-gorm/gorm

Ich bin mir nicht sicher, ob dieses Problem mit Ihrem Code oder Ihrer Dokumentation zusammenhängt.
Ich gehe auch davon aus, dass Sie GORM basierend auf Ruby On Rails oder PHP-Laravel entwickelt haben, weshalb ich glaube, dass es einen Fehler gibt.

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

Ich erwarte nicht, dass Sie allen meinen Vorschlägen zustimmen, weil Sie versuchen, Find() und First() dazu zu bringen, die 4 Befehle in Laravel auszuführen: All(), First(), Find(), Get().

Der Nachteil ist jedoch, dass Ihre Methode IMMER Slice zurückgibt, auch wenn es bequemer ist, One Struct (ohne Slice) zu erhalten, wenn Sie ein Ergebnis WOLLEN und ERWARTEN.

Hilfreichster Kommentar

Hallo @pjebs

Obwohl ich die Ideen von ActiveRecord gestohlen habe, funktioniert es nicht genau so, sondern funktioniert wie folgt:

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{})

Alle 3 Kommentare

Typ Kundenstruktur {
Id uint32 gorm:"column:id; primary_key:yes"
Access_token-String gorm:"column:access_token"
}

func (c Kunde) TableName() string {
"Kunden" zurückgeben
}

func MyMiddleware(rw http.ResponseWriter, r *http.Request) {
// u := []Kunde{}
u := &Kunde{}

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

}

Das ist das Problem:

ERSTER BEFEHL:
Dies sollte das erste Ergebnis aus der Sammlung aller zurückgegebenen Ergebnisse zurückgeben. (ob es zusätzliche WHERE-Parameter gibt oder nicht).
Es sollte das EINE Ergebnis in &Customer{} parsen und KEIN Array mit einem Ergebnis darin enthalten.

Derzeit funktioniert es nicht, wenn &u kein Verweis auf ein Slice ist. &u sollte auf &Kunde{} verweisen und nicht auf &[]Kunde{}.

Diese Funktion sollte auch NIEMALS einen zusätzlichen Parameter für den Primärschlüssel akzeptieren. Dafür gibt es die FIND-Funktion.

FINDE BEFEHL:
Wenn dem Find-Befehl ein Primärschlüssel zugewiesen wird, sollte er kein Slice zurückgeben. Es sollte auch IMMER einen Primärschlüsselwert erwarten.

Wenn Sie alle Werte haben möchten, verwenden Sie "ALL" COMMAND. db.ALL(&u) wobei &u=[]Kunde{}

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

ALLE BEFEHLE:
Dies sollte in Ihre Bibliothek aufgenommen werden. Das würde alle Werte zurückgeben.

db.All(&u), wobei &u=[]Kunde{}

BEFEHL ERHALTEN:
Dies sollte in Ihre Bibliothek aufgenommen werden. Dies würde ein ARRAY aller Werte zurückgeben, auch nachdem Sie WHERE-Einschränkungen gesetzt haben.

Hallo @pjebs

Obwohl ich die Ideen von ActiveRecord gestohlen habe, funktioniert es nicht genau so, sondern funktioniert wie folgt:

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{})
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen