pages/ru_RU/docs/has_one.md
Связь has one устанавливает связь с другой моделью, но с несколько разными семантиками (и последствиями). Эта ассоциация указывает, что каждый экземпляр модели содержит или обладает одной другой моделью.
Например, если ваше приложение включает пользователей и кредитные карты, и каждый пользователь может иметь только одну кредитную карту.
// User has one CreditCard, UserID is the foreign key
type User struct {
gorm.Model
CreditCard CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
// Retrieve user list with eager loading credit card
func GetAll(db *gorm.DB) ([]User, error) {
var users []User
err := db.Model(&User{}).Preload("CreditCard").Find(&users).Error
return users, err
}
Для связи has one, должен существовать внешний ключ, владелец сохранит первичный ключ модели принадлежащий ей в этом поле.
Название поля, как правило, генерируется при помощи типа модели has one плюс первичный ключ, для приведенного выше примера: UserID.
Когда вы даете пользователю кредитную карту, он сохранит ID пользователя в поле UserID.
Если вы хотите использовать другое поле для сохранения связей, вы можете изменить его при помощи тега foreignKey, например:
По умолчанию принадлежащая сущность сохранит первичный ключ модели has one во внешний ключ, вы можете изменить это, чтобы сохранялось в другое поле, например Name как в примере ниже.
Вы можете изменить поле связи с помощью тега references, например:
type User struct {
gorm.Model
Name string `gorm:"index"`
CreditCard CreditCard `gorm:"foreignKey:UserName;references:Name"`
}
type CreditCard struct {
gorm.Model
Number string
UserName string
}
Пожалуйста, смотрите Режим связи для работы с has one связями
GORM позволяет использовать нетерпеливую загрузку для связей has one с помощью Preload или Joins, смотрите Предзагрузка (Нетерпеливая загрузка) для подробностей
type User struct {
gorm.Model
Name string
ManagerID *uint
Manager *User
}
Вы можете настроить OnUpdate, OnDelete ограничения с помощью тега constraint, они будут созданы при миграции с помощью GORM, например:
type User struct {
gorm.Model
CreditCard CreditCard `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;"`
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
Вы также можете удалить выбранные ассоциации has one с помощью Select при удалении, подробнее описывается в Delete with Select