Dalam GORM, ORM yang berkuasa untuk Go, anda boleh mencipta perkaitan antara struct yang mewakili jadual pangkalan data. Dalam senario ini, anda mempunyai struct Place yang dikaitkan dengan struct Town, di mana setiap Place adalah milik satu Town.
Kod anda pada masa ini mengambil semua rekod Place, tetapi anda ingin memasukkan maklumat Bandar yang berkaitan untuk setiap Tempat. Ralat dalam pertanyaan anda ialah kunci asing TownID tidak dinyatakan dalam struct Place.
Untuk membetulkannya, ubah suai struct Place:
type Place struct { ID int Name string TownID int // The foreign key Town Town }
Kini, anda mempunyai berbilang pilihan untuk dapatkan semula data Bandar yang berkaitan:
Pilihan 1: Pemuatan Manual (Tidak Disyorkan)
Lelaran pada setiap Tempat dan muatkan Bandar yang berkaitan secara manual menggunakan Model. Berkaitan:
places := []Place{} db.Find(&places) for i, _ := range places { db.Model(places[i]).Related(&places[i].Town) }
Pendekatan ini, sambil menghasilkan hasil yang diharapkan, mengalami "N 1 " masalah, di mana berbilang pertanyaan pangkalan data dikeluarkan untuk setiap tempat.
Pilihan 2: Pramuat (Disyorkan)
Gunakan fungsi Pramuat untuk tidak sabar-sabar memuatkan Bandar yang berkaitan sambil mengambil rekod Tempat:
db.Preload("Town").Find(&places)
Ini akan mencetuskan hanya dua pertanyaan: satu untuk mengambil semua tempat dan satu untuk mengambil semua bandar yang berkaitan. Ia berskala baik dengan bilangan tempat dan bandar.
Output Jangkaan:
[{1 Place1 {1 Town1} 1} {2 Place2 {1 Town1} 1}]
Atas ialah kandungan terperinci Bagaimana untuk Mengambil Data Berkaitan dengan Cekap dalam Hubungan Tempat-Pekan GORM?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!