Gorm: Problème avec Find() et First()

Créé le 22 nov. 2014  ·  3Commentaires  ·  Source: go-gorm/gorm

Je ne sais pas si ce problème vient de votre code ou de votre documentation.
Je suppose également que vous avez conçu GORM basé sur Ruby On Rails ou PHP-Laravel, c'est pourquoi je pense qu'il y a une erreur.

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

Je ne m'attends pas à ce que vous soyez d'accord avec toutes mes suggestions car vous essayez de faire en sorte que Find() et First() accomplissent les 4 commandes de Laravel: All(), First(), Find(), Get().

Mais l'inconvénient est que votre méthode renvoie TOUJOURS une tranche même s'il est plus pratique d'obtenir One Struct (sans tranche) lorsque vous VOULEZ et ATTENDEZ un résultat.

Commentaire le plus utile

Bonjour @pjebs

Bien que j'aie volé les idées d'ActiveRecord, cela ne fonctionne pas exactement comme cela, mais fonctionne comme ci-dessous :

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

Tous les 3 commentaires

type Structure client {
Id uint32 gorm:"column:id; primary_key:yes"
Chaîne de jeton d'accès gorm:"column:access_token"
}

func (c Client) NomTable() chaîne {
retour "clients"
}

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

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

}

C'est le problème:

PREMIÈRE COMMANDE :
Cela devrait renvoyer le premier résultat de la collection de tous les résultats renvoyés. (qu'il y ait des paramètres WHERE supplémentaires ou non).
Il devrait analyser le résultat UN dans &Customer{} et PAS un tableau avec un résultat là-dedans.

Actuellement, cela ne fonctionne pas lorsque &u n'est pas une référence à une tranche. &u doit pointer sur &Customer{} et non sur &[]Customer{}.

Cette fonction ne doit également JAMAIS accepter un paramètre supplémentaire pour la clé primaire. C'est à cela que sert la fonction FIND.

TROUVER LA COMMANDE :
Lorsque la commande Find reçoit une clé primaire, elle ne doit pas renvoyer de tranche. Il doit également TOUJOURS s'attendre à une valeur de clé primaire.

Si vous voulez toutes les valeurs, utilisez la COMMANDE "TOUS". db.ALL(&u) où &u=[]Client{}

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

TOUTES LES COMMANDES :
Cela devrait être inclus dans votre bibliothèque. Cela renverrait toutes les valeurs.

db.All(&u), où &u=[]Client{}

OBTENIR LA COMMANDE :
Cela devrait être inclus dans votre bibliothèque. Cela renverrait un ARRAY de toutes les valeurs, y compris après avoir mis des contraintes WHERE.

Bonjour @pjebs

Bien que j'aie volé les idées d'ActiveRecord, cela ne fonctionne pas exactement comme cela, mais fonctionne comme ci-dessous :

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{})
Cette page vous a été utile?
0 / 5 - 0 notes