0Pricing
Go Academy · درس

الارتباطات

نمذج العلاقات

الارتباطات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

نمذجة العلاقات

تربط العلاقات في GORM العلاقات بين الجداول بحقوق الحقول في البنى. والأنواع الأربعة هي: له واحد، وله العديد، وينتمي إلى، وعلاقة متعدد إلى متعدد.

  • التعبير عن المفاتيح الخارجية كحقول في البنى
  • تحميل البيانات المرتبطة تلقائيًا
  • إنشاء السجلات المرتبطة معًا

علاقة له العديد

للمستخدم العديد من المنشورات. يحتفظ الكيان الأب بشريحة من الكيانات الأبناء، ويحتفظ الابن بمفتاح خارجي يعود إلى الأب.

type User struct {
    gorm.Model
    Name  string
    Posts []Post
}

type Post struct {
    gorm.Model
    Title  string
    UserID uint
}

علاقة ينتمي إلى

من منظور الابن، تنتمي المنشورة إلى مستخدم. أضف حقل User إلى جانب المفتاح الخارجي UserID للتعبير عن ذلك.

type Post struct {
    gorm.Model
    Title  string
    UserID uint
    User   User
}

علاقة له واحد

تشبه علاقة له واحد علاقة له العديد، لكنها تشير إلى سجل مرتبط واحد، مثل امتلاك المستخدم ملفًا شخصيًا واحدًا. ويحتفظ الابن بالمفتاح الخارجي.

type User struct {
    gorm.Model
    Profile Profile
}

type Profile struct {
    gorm.Model
    UserID uint
    Bio    string
}

علاقة متعدد إلى متعدد

ترتبط المستخدمون والأدوار بعلاقة متعدد إلى متعدد من خلال جدول ربط. وتسمّي وسم many2many جدول الربط هذا، ويُكتب كالتالي: gorm:"many2many:user_roles;" بين علامتي backtick بعد حقل Roles.

type User struct {
    gorm.Model
    // Roles field tag: gorm:"many2many:user_roles;"
    Roles []Role
}

type Role struct {
    gorm.Model
    Name string
}

Preload

لا تُحمّل البيانات المرتبطة افتراضيًا. تخبر Preload GORM بجلب العلاقات في استعلام منفصل، فتتجنب إجراء عملية بحث يدوية منفصلة.

var user User
db.Preload("Posts").First(&user, 1)
fmt.Println(len(user.Posts))

Preload متداخل

يمكنك التحميل المسبق عبر مستويات متعددة باستخدام مسار مفصول بنقاط، لتحميل منشورات المستخدمين وتعليقات كل منشورة في سلسلة استدعاءات واحدة.

db.Preload("Posts.Comments").First(&user, 1)

محاكاة قابلة للتشغيل للعلاقات

تحتاج GORM إلى قاعدة بيانات، لذلك يصوّر هذا المثال القابل للتشغيل علاقة له العديد والتحميل المسبق باستخدام شرائح في الذاكرة.

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))
}

الإنشاء مع العلاقات

إذا ضبطت حقل الشريحة قبل Create، تُدرج GORM الكيان الأب وأبناءه معًا، وتربط المفاتيح الخارجية تلقائيًا.

user := User{Name: "Ada", Posts: []Post{{Title: "Hi"}}}
db.Create(&user)

مشكلة N+1

يؤدي التكرار على الكيانات الآباء والاستعلام عن الأبناء في كل تكرار إلى استعلام واحد لكل أب، وهي مشكلة N+1. وتحل Preload ذلك بتجميع جلب البيانات المرتبطة في استعلام إضافي واحد.

نمط Association

تضيف واجهة Association السجلات المرتبطة أو تستبدلها أو تحذفها أو تفرغها دون التعامل يدويًا مع المفاتيح الخارجية، مثل db.Model(&user).Association("Posts").Append(&post).

تحقق سريع

اختبر معرفتك بالعلاقات.

مراجعة

لقد تعلمت العلاقات:

  • علاقات له واحد وله العديد وينتمي إلى وmany2many لنمذجة علاقات الكيانات
  • المفاتيح الخارجية حقول في البنى، مثل UserID
  • تُحمّل Preload العلاقات وتتجنب مشكلة N+1
  • يؤدي إنشاء أب مع أبنائه إلى ربط المفاتيح الخارجية
  • يضيف نمط Association العلاقات أو يستبدلها أو يفرغها

الأسئلة الشائعة

هل درس «الارتباطات» مجاني؟

نعم — نص درس «الارتباطات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «الارتباطات»؟

نمذج العلاقات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الارتباطات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. النماذج وAutoMigrate
  2. عمليات CRUD
  3. الارتباطات
  4. الخطافات والنطاقات
← العودة إلى Go Academy