Heim  >  Artikel  >  Backend-Entwicklung  >  Wie frage ich ein Modell ab, bei dem der eingebettete Wert einer Beziehung einem bestimmten Wert entspricht?

Wie frage ich ein Modell ab, bei dem der eingebettete Wert einer Beziehung einem bestimmten Wert entspricht?

WBOY
WBOYnach vorne
2024-02-09 18:39:08918Durchsuche

Wie frage ich ein Modell ab, bei dem der eingebettete Wert einer Beziehung einem bestimmten Wert entspricht?

Beim Entwickeln und Entwerfen von Datenbankmodellen müssen wir manchmal abfragen, ob der eingebettete Wert in der Beziehung einem bestimmten Wert entspricht. Dieses Problem tritt in praktischen Anwendungen häufig auf, ist jedoch möglicherweise nicht einfach zu lösen. In diesem Artikel stelle ich Ihnen ein Modell vor, mit dem Sie effizient abfragen können, ob der eingebettete Wert einer Beziehung einem bestimmten Wert entspricht. Kein Grund zur Sorge, ich werde es klar und prägnant und leicht verständlich erklären, damit Sie es schnell verstehen und auf die tatsächliche Entwicklung anwenden können. Lass uns einen Blick darauf werfen!

Frageninhalt

Ich habe zwei verschiedene Modelle (carstypes),它们彼此相关(属于关系),其中两个模型都有一个嵌入式 struct 用于公共数据(post)。我想检索某些 types,但只想收到 postcars Antworten mit Werten gleich einem bestimmten Wert.

Shorty sagte, basierend auf dem Modell unten möchte ich feststellen, dass alle types,其中cars.post.published gleich wahr sind.

Modell

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"`
}

Verwenden Sie db.preload("car").find(&type) 我能够在答案对象中获取 car 值。如果我在 car 结构上使用 where() 函数(即 where(car{brand: "volvo"}) 我可以通过 brand 获取值,但是当使用 post 时(即 where(car{post: post {published: true})) und es wird einfach alles zurückgegeben.

Ich würde besser das Hauptmodell verwenden, das abgefragt werden muss, als Grundlage für die where()-Funktion. Zum Beispiel:

q := Type{Car: Car{Post: Post{Published: true}}}
db.Preload("Car").Where(q).Find(&Type)

...aber das scheint nicht zu funktionieren. Wie implementiert man eine solche Abfrage, ohne den Roh-SQL-Generator zu verwenden?

Lösung

Ich konnte Ihr Problem auf folgende Weise lösen. Zuerst teile ich den Code und gehe dann auf die wichtigsten Punkte ein, die es wert sind, erklärt zu werden.

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

Lassen Sie mich nun einige Erkenntnisse teilen.

Strukturdefinition

Ich habe es leicht geändert, um dieser Szene gerecht zu werden. Ich habe das Gegenstück aus der type 结构中删除了 car 字段,并在 car-Strukturdefinition hinzugefügt.

Einstellungen und Samen

Dann habe ich die Datenbankverbindung über Gorm eingerichtet. Ich synchronisiere das im Code definierte Modell mit der in der Datenbank vorhandenen Beziehung. Zur Veranschaulichung habe ich einige Dummy-Daten manuell eingegeben.

Logik lesen

Dann führe ich die Abfrage aus, um die relevanten Daten zu erhalten. Ich habe die folgende Methode verwendet:

  1. debug: Wird zum Aufzeichnen tatsächlicher SQL-Anweisungen verwendet
  2. model: Wird verwendet, um die Beziehung anzugeben, die wir bearbeiten möchten
  3. preload:用于加载typeVerwandt
  4. where: Wird zum Festlegen von Bedingungen verwendet (in unserem Fall befindet sich der Filter in der eingebetteten Struktur)
  5. find: Wird verwendet, um Ergebnisse Variablen zuzuordnen

Bitte sagen Sie mir, ob dies zur Lösung Ihres Problems beiträgt. Vielen Dank!

Das obige ist der detaillierte Inhalt vonWie frage ich ein Modell ab, bei dem der eingebettete Wert einer Beziehung einem bestimmten Wert entspricht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen