Maison >développement back-end >Golang >Comment interroger un modèle où la valeur intrinsèque d'une relation est égale à une valeur spécifique ?
Lors du développement et de la conception de modèles de bases de données, nous devons parfois nous demander si la valeur intégrée dans la relation est égale à une valeur spécifique. Ce problème est souvent rencontré dans les applications pratiques, mais il n’est pas forcément facile à résoudre. Dans cet article, je vais vous présenter un modèle avec un moyen efficace de demander si la valeur intrinsèque d'une relation est égale à une valeur spécifique. Ne vous inquiétez pas, je l'expliquerai clairement dans un langage concis et facile à comprendre pour vous aider à le comprendre et à l'appliquer rapidement au développement réel. Nous allons jeter un coup d'oeil!
J'ai deux modèles différents (cars
和 types
),它们彼此相关(属于关系),其中两个模型都有一个嵌入式 struct
用于公共数据(post
)。我想检索某些 types
,但只想收到 post
的 cars
réponses avec des valeurs égales à une certaine valeur.
shorty a dit, sur la base du modèle ci-dessous, je veux trouver tous types
,其中cars.post.published
égaux à vrai.
Modèle
type post struct { published bool } type car struct { gorm.model brand string post post `gorm:"embedded"` } type type struct { gorm.model name string carid uint32 car car post post `gorm:"embedded"` }
Utilisez db.preload("car").find(&type)
我能够在答案对象中获取 car
值。如果我在 car
结构上使用 where()
函数(即 where(car{brand: "volvo"}
) 我可以通过 brand
获取值,但是当使用 post
时(即 where(car{post: post {published: true})
) et il renverra simplement tout.
Je ferais mieux d'utiliser le modèle principal qui doit être interrogé comme base pour la fonction where()
. Par exemple :
q := Type{Car: Car{Post: Post{Published: true}}} db.Preload("Car").Where(q).Find(&Type)
...mais ça ne semble pas fonctionner. Comment implémenter une telle requête sans utiliser le générateur SQL brut ?
J'ai pu résoudre votre problème de la manière suivante. Je partagerai d’abord le code, puis j’aborderai les points clés qui méritent d’être expliqués.
package main import ( "fmt" "gorm.io/driver/postgres" "gorm.io/gorm" ) type Post struct { Published bool } type Car struct { gorm.Model Brand string TypeID int Type Type Post Post `gorm:"embedded"` } type Type struct { gorm.Model Name string CarID int Post Post `gorm:"embedded"` } func main() { dsn := "host=localhost port=54322 user=postgres password=postgres dbname=postgres sslmode=disable" db, err := gorm.Open(postgres.Open(dsn)) if err != nil { panic(err) } db.AutoMigrate(&Car{}) db.AutoMigrate(&Type{}) // uncomment these to seed data // db.Create(&Car{Brand: "Tesla", Type: Type{Name: "SUV", Post: Post{Published: true}}, Post: Post{Published: true}}) // db.Create(&Car{Brand: "Ford", Type: Type{Name: "City", Post: Post{Published: false}}, Post: Post{Published: false}}) var cars []Car if err := db.Debug().Model(&Car{}).Preload("Type").Where(&Car{Post: Post{Published: true}}).Find(&cars).Error; err != nil { panic(err) } for _, v := range cars { fmt.Println(v.Type.Name) } }
Maintenant, permettez-moi de partager quelques idées.
Je l'ai légèrement modifié pour gérer cette scène. J'ai ajouté son homologue de la définition de la structure type
结构中删除了 car
字段,并在 car
.
Ensuite, j'ai configuré la connexion à la base de données via gorm. Je synchronise le modèle défini dans le code avec la relation qui existe dans la base de données. Pour démontrer, j'ai semé manuellement des données factices.
Ensuite, j'exécute la requête pour obtenir les données pertinentes. J'ai utilisé la méthode suivante :
debug
: utilisé pour enregistrer les instructions SQL réellesmodel
: utilisé pour préciser la relation que nous souhaitons gérerpreload
:用于加载type
Connexewhere
: permet de préciser des conditions (dans notre cas, le filtre est sur la structure embarquée) find
: utilisé pour mapper les résultats aux variablesS'il vous plaît dites-moi si cela aide à résoudre votre problème, merci !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!