"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف أقوم بتضمين بنية داخل بنية أخرى في GORM وتخزينها كحقل في الجدول الرئيسي؟

كيف أقوم بتضمين بنية داخل بنية أخرى في GORM وتخزينها كحقل في الجدول الرئيسي؟

نشرت في 2025-01-30
تصفح:790

How do I embed a struct within another struct in GORM and store it as a field in the main table?

تضمين بنية مع gorm

في gorm ، عند تضمين بنية أخرى ، قد ينشئ GORM جدولًا منفصلًا للبنية المضمنة. ومع ذلك ، إذا كنت ترغب في تخزين البنية المضمنة كحقل إضافي داخل الجدول الرئيسي ، فيمكن استخدام النهج التالي:

بنية مضمنة:

اكتب struct { نقطة *نقطة جغرافية } اكتب بنية الجغرافية { اللات Float64 Lon Float64 }
  1. قم بتنفيذ واجهات sql.scanner و driver.valuer للبنية المدمجة:
type A struct {
    Point *GeoPoint
}

type GeoPoint struct {
    Lat float64
    Lon float64
}
  1. قم بتحديث نموذج gorm لاستخدام البنية المدمجة مع gorm: "العمود" و gorm: "type" العلامات:
func (gp *GeoPoint) Scan(src interface{}) error {

    // Convert the `src` value to a byte array.
    b, ok := src.([]byte)
    if !ok {
        return fmt.Errorf("could not convert to byte array")
    }

    // Unmarshal the byte array into the `GeoPoint` struct.
    if err := json.Unmarshal(b, gp); err != nil {
        return fmt.Errorf("could not unmarshal JSON: %v", err)
    }

    return nil
}

func (gp GeoPoint) Value() (driver.Value, error) {

    // Marshal the `GeoPoint` struct into a byte array.
    b, err := json.Marshal(gp)
    if err != nil {
        return nil, fmt.Errorf("could not marshal JSON: %v", err)
    }

    return string(b), nil
}
عن طريق تنفيذ طرق المسح والقيمة ، يمكن لـ GORM تحويل البنية المضمنة من وإلى تنسيق JSON. The Gorm: "Column" و Gorm: "type" تحدد اسم العمود ونوع البيانات للبنية المضمنة داخل الجدول الرئيسي.
    أحدث البرنامج التعليمي أكثر>

    تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

    Copyright© 2022 湘ICP备2022001581号-3