Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?

Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?

Susan Sarandon
Lepaskan: 2024-12-29 08:56:11
asal
773 orang telah melayarinya

How to Efficiently Query Associated Entities in GORM?

Persatuan dalam GORM Golang

Dalam Go, menggunakan GORM ORM, cabaran biasa timbul apabila menanyakan beberapa entiti dengan maklumat yang berkaitan. Mari kita teliti contoh untuk menggambarkan isu ini.

Pertimbangkan struktur yang mewakili bandar dan tempat yang berkaitan dengannya:

type Place struct {
  ID          int
  Name        string
  Town        Town
}

type Town struct {
  ID   int
  Name string
}
Salin selepas log masuk

Andaikan pangkalan data dengan sampel data berikut:

places table towns Table
id name town_id id name
1 Place1 1 1 Town1
2 Place2 1 2 Town2

Untuk mendapatkan semula semua tempat bersama dengan bandar yang sepadan, seseorang mungkin mencuba perkara berikut pertanyaan:

db := gorm.Open("sqlite3", "./data.db")
defer db.Close()
places := []Place{}
db.Find(&places)
Salin selepas log masuk

Walau bagaimanapun, hasilnya akan menghasilkan:

[{1 Place1 {0 }} {2 Mares Place2 {0 }}]
Salin selepas log masuk

Perhatikan bahawa maklumat bandar yang sepadan tiada. Untuk membetulkannya, kita perlu menentukan kunci asing dalam struct Tempat sebagai TownID:

type Place struct {
  ID          int
  Name        string
  Description string
  TownID      int
  Town        Town
}
Salin selepas log masuk

Untuk mendapatkan hasil yang diharapkan, seseorang boleh memilih pendekatan berikut:

db.Find(&places)
for i, _ := range places {
    db.Model(places[i]).Related(&places[i].Town)
}
Salin selepas log masuk

Ini sememangnya akan menghasilkan hasil yang diingini, tetapi ia mengalami masalah n 1, kerana ia mencetuskan pertanyaan pangkalan data tambahan untuk setiap tempat.

Selengkapnya penyelesaian yang cekap melibatkan penggunaan Pramuat:

db.Preload("Town").Find(&places)
Salin selepas log masuk

Pendekatan ringkas ini menghasilkan pertanyaan pangkalan data yang dioptimumkan berikut:

SELECT  * FROM "places"
[0.92ms]  SELECT  * FROM "towns"  WHERE ("id" in ('1'))
Salin selepas log masuk

Dengan menggunakan Pramuat, kami memastikan bahawa maklumat bandar yang berkaitan diperolehi dalam satu pertanyaan pangkalan data, dengan itu mengoptimumkan prestasi dan menghapuskan masalah n 1.

Atas ialah kandungan terperinci Bagaimana untuk Menyoal Entiti Bersekutu dengan Cekap dalam GORM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan