Scopes and Joins
Scope'lar va Join'lar
"Scope" — takrorlanadigan so'rov qismini (masalan "faqat faol foydalanuvchilar") qayta ishlatiladigan funksiyaga chiqarish naqshi. Joins esa boshqa jadval bilan bog'lab so'rash uchun.
// Scope — qayta ishlatiladigan so'rov qismi
func ActiveUsers(db *gorm.DB) *gorm.DB {
return db.Where("active = ?", true)
}
func RecentFirst(db *gorm.DB) *gorm.DB {
return db.Order("created_at desc")
}
var users []User
db.Scopes(ActiveUsers, RecentFirst).Find(&users)
// Joins — boshqa jadval bilan bog'lab so'rash
var orders []Order
db.Joins("JOIN users ON users.id = orders.user_id").
Where("users.age > ?", 18).
Find(&orders)Scope — oddiy funksiya, *gorm.DB oladi va o'zgartirilgan *gorm.DB qaytaradi ("Accept Interfaces, Return Structs" darsidagi kabi zanjirlanadigan naqsh). db.Scopes(A, B) bir nechta scope'ni birlashtiradi — bu "Middleware: Logging and Chaining" darsidagi middleware zanjirlashga juda o'xshaydi, faqat HTTP handler emas, so'rov qurish uchun. Joins esa Preloaddan farqli — natijani bitta SQL so'rovda (haqiqiy SQL JOIN bilan) oladi, ikkita alohida so'rov emas.
Key Takeaway
Key Takeaway:
Scope'lar takrorlanuvchi so'rov mantiqini qayta ishlatiladigan qiladi; Joins esa bir nechta jadvalni bitta SQL so'rovida birlashtiradi.
NEXT UP
Many-to-Many Relationships