PHP-Editor Xigua stellt Ihnen eine effiziente Datenerfassungsmethode vor – Gorm. Gorm ist eine Golang-basierte ORM-Bibliothek, die die Interaktion mit Datenbanken erleichtert. Wenn wir Gorm verwenden, können wir alle Daten aus der Tabelle basierend auf den Bedingungen der verschachtelten Tabelle abrufen, ohne langwierige manuelle Abfragen. Diese Methode vereinfacht nicht nur den Code, sondern verbessert auch die Abfrageeffizienz, sodass Entwickler Daten bequemer verwalten können. Sowohl Anfänger als auch erfahrene Entwickler können mit Gorm problemlos Datenerfassungsfunktionen implementieren.
Ich habe eine Tabelle mit der folgenden Golang-Struktur:
order { id transactionid transaction } transaction { id profileid profile } profile { id accountid account }
Wie erhalte ich alle Bestellungen mit Konto-ID-Bedingungen über Gorm? Ich habe es versucht:
var orders []*Order res := r.db. Joins("Transaction"). Preload("Transaction.Profile"). Where("Transaction.Profile.account_id = 1"). Find(&orders)
Aber es funktioniert nicht.
Die Lösung sollte basierend auf der von Ihnen bereitgestellten Strukturdefinition funktionieren. Lassen Sie mich Ihnen zuerst den Code zeigen und dann gehe ich jeden Schritt durch:
package main import ( "fmt" _ "github.com/lib/pq" "gorm.io/driver/postgres" "gorm.io/gorm" ) type Order struct { Id int TransactionId int Transaction Transaction } type Transaction struct { Id int ProfileId int Profile Profile } type Profile struct { Id int AccountId int Account Account } type Account struct { Id int } func main() { dsn := "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } db.AutoMigrate(&Account{}) db.AutoMigrate(&Profile{}) db.AutoMigrate(&Transaction{}) db.AutoMigrate(&Order{}) db.Create(&Account{}) db.Create(&Profile{AccountId: 1}) db.Create(&Transaction{ProfileId: 1}) db.Create(&Order{TransactionId: 1}) // order + transaction + profile + account var order Order db.Debug().Preload("Transaction.Profile.Account").Joins("inner join transactions t on orders.transaction_id = t.id").Joins("inner join profiles p on p.id = t.profile_id").Joins("inner join accounts a on p.account_id = a.id").First(&order, "a.id = ?", 1) fmt.Println(order) }
Schauen wir uns den Code genauer an.
Hier hat sich nichts geändert. Stellen Sie beim Deklarieren einer Struktur sicher, dass Sie die Gorm-Konventionen verstehen, da Gorm darauf basierend Beziehungen, Fremdschlüssel und Einschränkungen erstellt.
Hier finden Sie die Verbindung zu Postgres, den automatischen Migrationsbefehl zum Synchronisieren von Tabellen und das Einfügen einiger Dummy-Daten.
Hier verwenden wir viele Methoden, die im Gorm-Paket von go bereitgestellt werden. Sehen wir sie uns in einer kurzen Liste an:
debug
: Es gibt die Roh-SQL-Abfrage an die Konsole aus. Sehr nützlich bei der Bearbeitung komplexer Anfragen preload
: Laden Sie verwandte Entitäten, schließen Sie sie jedoch nicht in die endgültige von gorm generierte Abfrage ein joins
:它指定在 join 子句中必须引用哪些表。使用 joins
Wir fügen diese Klausel zur Abfrage hinzu. first
:它既用于仅获取一条记录,也用于指定一些过滤器,例如我们的例子(例如 a.id = ?
). Wenn das Ihr Problem löst, lassen Sie es mich bitte wissen, vielen Dank!
Das obige ist der detaillierte Inhalt vonGorm ruft alle Daten aus der Tabelle basierend auf dem Zustand der verschachtelten Tabelle ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!