Heim  >  Artikel  >  Backend-Entwicklung  >  Gorm ruft alle Daten aus der Tabelle basierend auf dem Zustand der verschachtelten Tabelle ab

Gorm ruft alle Daten aus der Tabelle basierend auf dem Zustand der verschachtelten Tabelle ab

王林
王林nach vorne
2024-02-10 12:42:08569Durchsuche

Gorm 根据嵌套表的条件从表中获取所有数据

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.

Frageninhalt

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.

Workaround

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.

Strukturdefinition

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.

Datenbank vorbereiten

Hier finden Sie die Verbindung zu Postgres, den automatischen Migrationsbefehl zum Synchronisieren von Tabellen und das Einfügen einiger Dummy-Daten.

Abfrage

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!

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