Many To Many (многие ко многим)
Many to Many добавляет объединяющую таблицу между двумя моделями.
Например, если ваше приложение включает пользователей и языки, и пользователь может говорить на многих языках, и многие пользователи могут говорить на определенном языке.
// Пользователь имеет и принадлежит многим языкам, `user_languages` объединяющую таблица |
При использовании GORM AutoMigrate
для создания таблицы по модели User
, GORM автоматически создаст таблицу объединения
Обратная ссылка
Declare
// Пользователь имеет и принадлежит ко многим языкам, используется `user_languages` как таблица связей |
Retrieve
// Retrieve user list with eager loading languages |
Переопределить внешний ключ
Для many2many
связей, объединяющая таблица имеет внешний ключ, который ссылается на две модели, например:
type User struct { |
Чтобы перезаписать их, вы можете использовать тэг foreignKey
, references
, joinForeignKey
, joinReferences
, необязательно использовать их вместе, вы можете просто использовать один из них, чтобы перезаписать внешние ключи
type User struct { |
ПРИМЕЧАНИЕ: Некоторые базы данных позволяют создавать только внешние ключи базы данных, которые ссылаются на поле, имеющее уникальный индекс, поэтому вам необходимо указать тег
unique index
, если вы создаете внешние ключи базы данных при миграции
Самосвязанный Many2Many
Самосвязанные отношения «многие-многие»
type User struct { |
Нетерпеливая загрузка
GORM allows eager loading has many associations with Preload
, refer Preloading (Eager loading) for details
CRUD с Many2Many
Please checkout Association Mode for working with many2many relations
Настроить таблицу связей
JoinTable
can be a full-featured model, like having Soft Delete
,Hooks
supports and more fields, you can set it up with SetupJoinTable
, for example:
NOTE: Customized join table’s foreign keys required to be composited primary keys or composited unique index
type Person struct { |
Ограничения внешних ключей
You can setup OnUpdate
, OnDelete
constraints with tag constraint
, it will be created when migrating with GORM, for example:
type User struct { |
You are also allowed to delete selected many2many relations with Select
when deleting, checkout Delete with Select for details
Композитные внешние ключи
If you are using Composite Primary Keys for your models, GORM will enable composite foreign keys by default
You are allowed to override the default foreign keys, to specify multiple foreign keys, just separate those keys’ name by commas, for example:
type Tag struct { |
Also check out Composite Primary Keys