Asosiasi
Modelkan relasi
Asosiasi adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Memodelkan Relasi
Asosiasi GORM memetakan hubungan antar-tabel ke bidang struktur. Empat jenisnya adalah memiliki satu, memiliki banyak, dimiliki oleh, dan banyak-ke-banyak.
- Menyatakan kunci asing sebagai bidang struktur
- Memuat data terkait secara otomatis
- Membuat rekaman terkait secara bersamaan
Memiliki Banyak
Satu pengguna memiliki banyak kiriman. Induk menyimpan daftar anak, dan anak menyimpan kunci asing yang merujuk kembali ke induk.
type User struct {
gorm.Model
Name string
Posts []Post
}
type Post struct {
gorm.Model
Title string
UserID uint
}Dimiliki Oleh
Dari sudut pandang anak, sebuah kiriman dimiliki oleh pengguna. Tambahkan bidang User serta kunci asing UserID untuk menyatakannya.
type Post struct {
gorm.Model
Title string
UserID uint
User User
}Memiliki Satu
Relasi memiliki satu mirip dengan relasi memiliki banyak, tetapi hanya memiliki satu rekaman terkait, misalnya seorang pengguna memiliki satu profil. Anak menyimpan kunci asing.
type User struct {
gorm.Model
Profile Profile
}
type Profile struct {
gorm.Model
UserID uint
Bio string
}Banyak ke Banyak
Pengguna dan peran memiliki hubungan banyak-ke-banyak melalui tabel penghubung. Penanda many2many menentukan nama tabel penghubung tersebut, yang ditulis sebagai gorm:"many2many:user_roles;" di antara tanda aksen terbalik setelah bidang Roles.
type User struct {
gorm.Model
// Roles field tag: gorm:"many2many:user_roles;"
Roles []Role
}
type Role struct {
gorm.Model
Name string
}Preload
Secara bawaan, data terkait tidak dimuat. Preload memberi tahu GORM untuk mengambil asosiasi dalam kueri terpisah, sehingga Anda tidak perlu melakukan pencarian manual terpisah.
var user User
db.Preload("Posts").First(&user, 1)
fmt.Println(len(user.Posts))Preload Bertingkat
Anda dapat melakukan preload pada beberapa tingkat menggunakan jalur bertitik, dengan memuat kiriman pengguna dan komentar dari setiap kiriman dalam satu rangkaian pemanggilan.
db.Preload("Posts.Comments").First(&user, 1)Simulasi Asosiasi yang Dapat Dijalankan
GORM memerlukan basis data, jadi contoh yang dapat dijalankan ini memodelkan hubungan memiliki banyak dan pemuatan awal menggunakan irisan dalam memori.
package main
import "fmt"
type Post struct {
ID int
UserID int
Title string
}
type User struct {
ID int
Name string
Posts []Post
}
func preload(u *User, all []Post) {
for _, p := range all {
if p.UserID == u.ID {
u.Posts = append(u.Posts, p)
}
}
}
func main() {
u := User{ID: 1, Name: "Ada"}
all := []Post{{1, 1, "Hello"}, {2, 1, "World"}, {3, 2, "Other"}}
preload(&u, all)
fmt.Printf("%s has %d posts\n", u.Name, len(u.Posts))
}Membuat dengan Asosiasi
Jika Anda mengatur bidang irisan sebelum Create, GORM menyisipkan induk dan anak-anaknya secara bersamaan serta menghubungkan kunci asing secara otomatis.
user := User{Name: "Ada", Posts: []Post{{Title: "Hi"}}}
db.Create(&user)Masalah N Plus Satu
Melakukan perulangan pada induk dan mengkueri anak pada setiap iterasi menyebabkan satu kueri untuk setiap induk, yaitu masalah N+1. Preload mengatasinya dengan menggabungkan pengambilan data terkait ke dalam satu kueri tambahan.
Mode Asosiasi
API Association menambahkan, mengganti, menghapus, atau mengosongkan rekaman terkait tanpa penanganan kunci asing secara manual, misalnya db.Model(&user).Association("Posts").Append(&post).
Pemeriksaan Singkat
Uji pengetahuan Anda tentang asosiasi.
Ringkasan
Anda telah mempelajari asosiasi:
- Hubungan memiliki satu, memiliki banyak, dimiliki oleh, dan many2many
- Kunci asing adalah bidang struktur seperti UserID
- Preload memuat asosiasi dan menghindari N+1
- Membuat induk bersama anak-anaknya menghubungkan kunci asing
- Mode asosiasi menambahkan, mengganti, atau mengosongkan relasi
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Asosiasi” gratis?
Ya — teks lengkap “Asosiasi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Asosiasi”?
Modelkan relasi Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Asosiasi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.