Heim >Backend-Entwicklung >Golang >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!
Ich habe zwei verschiedene Modelle (cars
和 types
),它们彼此相关(属于关系),其中两个模型都有一个嵌入式 struct
用于公共数据(post
)。我想检索某些 types
,但只想收到 post
的 cars
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?
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.
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.
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.
Dann führe ich die Abfrage aus, um die relevanten Daten zu erhalten. Ich habe die folgende Methode verwendet:
debug
: Wird zum Aufzeichnen tatsächlicher SQL-Anweisungen verwendetmodel
: Wird verwendet, um die Beziehung anzugeben, die wir bearbeiten möchtenpreload
:用于加载type
Verwandtwhere
: Wird zum Festlegen von Bedingungen verwendet (in unserem Fall befindet sich der Filter in der eingebetteten Struktur) find
: Wird verwendet, um Ergebnisse Variablen zuzuordnenBitte 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!