Мне показалось сбивающим с толку настройку отношения «многие ко многим» (n: n) между двумя отношениями (или таблицами) с помощью Sequelize ORM, и поэтому после того, как я смог его взломать, я подумал, что было бы разумно создать простое руководство, поэтому , это.
Во-первых, позвольте мне описать сценарий: существует много users
, и каждый user
может принадлежать множеству groups
или вообще не принадлежать group
, и каждый group
может содержать много users
или не содержать users
вообще. Итак, да, это Many-to-Many
связь между users
таблицей и groups
таблицей.
Мое мнение
Для достижения этой взаимосвязи мне нужна join
таблица, и я назову ее GroupUsers
. Это будет таблица, описывающая отношения между users
и groups
. В нем будут два столбца: userId
и groupId
, которые являются внешними ключами, ссылающимися на обе таблицы (пользователей и группы) соответственно.
Код
Модель пользователей
Игнорируйте другие части кода, я добавил их только ради этого. Сосредоточьтесь на блоке кода Users.associate
. Чтобы создать нашу ассоциацию, нам нужно объявить ее, используя этот блок кода, именно так, как есть. Я думаю, что это достаточно ясно, что он делает, нет необходимости объяснять это.
Единственная причина, по которой мне пришлось объявить эту ассоциацию, - это то, что когда я получаю пользователя, я также получаю список групп, к которым он принадлежит. Вот как это выглядит с ассоциацией:
За кулисами указанного выше объекта json:
Контроллер пользователей
Итак, как вы можете видеть, ассоциации экономят вам много кода, без ассоциаций мне вместо этого пришлось бы запросить таблицу Users
, а затем запросить таблицу GroupUsers
, а затем запросить таблицу Groups
очень похожим на спагетти способом.
Баллы, которые нужно забрать домой:
- Столкнувшись с подобным сценарием, создайте
join
таблицу. - Затем создайте связь между объединенными таблицами.
- Удачи с
include
опциями.
[ОБНОВИТЬ]
Прошло некоторое время с тех пор, как я написал эту статью, и за это время я понял, что было бы намного полезнее, если бы я обновил статью на основе комментариев читателей. Вот как выглядят модели GroupUsers
и Groups
:
Модель GroupUsers
Групповая модель