В этой статье блога мы погрузимся в мир GORM, популярной библиотеки ORM (объектно-реляционного сопоставления) для языка программирования Go, и исследуем различные методы переопределения внешних ключей в ассоциациях «имеет много». Мы будем использовать разговорный язык и предоставим примеры кода, чтобы вам было легче понять концепции. Итак, начнём!
Понимание ассоциаций «имеет много».
Прежде чем мы углубимся в переопределение внешних ключей, давайте кратко разберемся, что означают ассоциации «имеет много» в GORM. В отношении «имеет много» одна запись в таблице связана с несколькими записями в другой таблице. Например, пользователь может иметь несколько публикаций в приложении блога. GORM упрощает управление такими отношениями, предоставляя интуитивно понятные API.
type User struct {
ID uint
Name string
Posts []Post `gorm:"foreignkey:UserID"`
}
type Post struct {
ID uint
UserID uint
Title string
}
В приведенном выше коде мы переопределяем внешний ключ для ассоциации Postsв структуре User, указав foreignkey:UserIDв теге структуры. Это указывает GORM использовать поле UserIDв качестве внешнего ключа.
Метод 2: использование ограничения ForeignKey
Другой способ переопределить внешние ключи — явно определить ограничение внешнего ключа. Для этого в GORM предусмотрен метод ForeignKey. Вот пример:
type User struct {
ID uint
Name string
Posts []Post `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:UserID"`
}
type Post struct {
ID uint
UserID uint
Title string
}
В приведенном выше коде мы используем параметр foreignKey:UserIDв теге struct ассоциации Posts. Это гарантирует, что ограничение внешнего ключа будет применено к полю UserID.
Метод 3: использование JoinTable
GORM также предоставляет метод JoinTableдля явного указания соединяемой таблицы и связей внешнего ключа. Вот пример:
type User struct {
ID uint
Name string
Posts []Post `gorm:"many2many:user_posts;joinForeignKey:user_id;"`
}
type Post struct {
ID uint
Title string
}
В приведенном выше коде мы определяем объединяемую таблицу с помощью тега many2many, а затем указываем внешний ключ с помощью параметра joinForeignKey. Это позволяет нам переопределить внешний ключ по умолчанию, созданный GORM.