Has Many (имеет много)
Связь has many (имеет много)
устанавливает связь с другой моделью, в отличие от has one (имеет одну)
, владелец может не иметь или иметь много экземпляров моделей.
Например, если ваше приложение включает пользователей и кредитные карты, и каждый пользователь может иметь много кредитных карт.
Declare
// User имеет много CreditCards, UserID это внешний ключ |
Retrieve
// Retrieve user list with eager loading credit cards |
Переопределить внешний ключ
Чтобы определить связь has many (имеет много)
, должен существовать внешний ключ. Имя внешнего ключа по умолчанию - это имя типа владельца плюс имя поля первичного ключа
Например, для определения модели, принадлежащей User
, внешний ключ должен быть UserID
.
Чтобы использовать другое поле в качестве внешнего ключа, вы можете настроить его с помощью тега foreignKey
, например:
type User struct { |
Переопределить связи
GORM обычно использует первичный ключ владельца в качестве значения внешнего ключа, для приведенного выше примера это ID
модели User
,
При назначении кредитных карт пользователю, GORM сохранит ID
пользователя в поле UserID
.
Вы можете изменить поле связи с помощью тега references
, например:
type User struct { |
CRUD с has many
Пожалуйста, смотрите режим связей для работы с has many (имеет много) связями
Нетерпеливая загрузка
GORM позволяет использовать нетерпеливую загрузку для связей has many (имеет много) с помощью Preload
, смотрите Предзагрузка (Нетерпеливая загрузка) для подробностей
Самосвязанный Has Many
type User struct { |
Ограничения внешних ключей
Вы можете настроить OnUpdate
, OnDelete
ограничения с помощью тега constraint
, они будут созданы при миграции с помощью GORM, например:
type User struct { |
Вы также можете удалить выбранные ассоциации has many с помощью Select
при удалении, ознакомьтесь с Delete with Select для подробностей