Has One (имеет одну)
Связь has one устанавливает связь с другой моделью, но с несколько разными семантиками (и последствиями). Эта ассоциация указывает, что каждый экземпляр модели содержит или обладает одной другой моделью.
Например, если ваше приложение включает пользователей и кредитные карты, и каждый пользователь может иметь только одну кредитную карту.
Определение
// User has one CreditCard, UserID is the foreign key |
Извлечение
// Retrieve user list with eager loading credit card |
Переопределить внешний ключ
Для связи has one, должен существовать внешний ключ, владелец сохранит первичный ключ модели принадлежащий ей в этом поле.
Название поля, как правило, генерируется при помощи типа модели has one плюс первичный ключ, для приведенного выше примера: UserID.
Когда вы даете пользователю кредитную карту, он сохранит ID пользователя в поле UserID.
Если вы хотите использовать другое поле для сохранения связей, вы можете изменить его при помощи тега foreignKey, например:
type User struct { |
Переопределить связи
По умолчанию принадлежащая сущность сохранит первичный ключ модели has one во внешний ключ, вы можете изменить это, чтобы сохранялось в другое поле, например Name как в примере ниже.
Вы можете изменить поле связи с помощью тега references, например:
type User struct { |
CRUD с has one
Пожалуйста, смотрите Режим связи для работы с has one связями
Нетерпеливая загрузка
GORM позволяет использовать нетерпеливую загрузку для связей has one с помощью Preload или Joins, смотрите Предзагрузка (Нетерпеливая загрузка) для подробностей
Самосвязанный Has One
type User struct { |
Ограничения внешних ключей
Вы можете настроить OnUpdate, OnDelete ограничения с помощью тега constraint, они будут созданы при миграции с помощью GORM, например:
type User struct { |
You are also allowed to delete selected has one associations with Select when deleting, checkout Delete with Select for details