Maison  >  Article  >  développement back-end  >  Comment interroger un modèle où la valeur intrinsèque d'une relation est égale à une valeur spécifique ?

Comment interroger un modèle où la valeur intrinsèque d'une relation est égale à une valeur spécifique ?

WBOY
WBOYavant
2024-02-09 18:39:08918parcourir

Comment interroger un modèle où la valeur intrinsèque dune 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!

Contenu des questions

J'ai deux modèles différents (carstypes),它们彼此相关(属于关系),其中两个模型都有一个嵌入式 struct 用于公共数据(post)。我想检索某些 types,但只想收到 postcars 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 ?

Solution

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.

Définition de la structure

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.

Paramètres et graines

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.

Lire la logique

Ensuite, j'exécute la requête pour obtenir les données pertinentes. J'ai utilisé la méthode suivante :

  1. debug : utilisé pour enregistrer les instructions SQL réelles
  2. model : utilisé pour préciser la relation que nous souhaitons gérer
  3. preload:用于加载typeConnexe
  4. where : permet de préciser des conditions (dans notre cas, le filtre est sur la structure embarquée)
  5. find : utilisé pour mapper les résultats aux variables

S'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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer