Создать составной первичный ключ от ассоциации в Sequelize - PullRequest
0 голосов
/ 05 марта 2019

У меня есть две модели: Person и Team

Допустим, модели просты (достаточно предположить базовые типы string / int):

team:
  id
  name
  ownerId

и

person:
  id
  name

Я хочу представить ассоциации между этими двумя моделями, чтобы Человек мог принадлежать ко многим Командам, а Команда может принадлежать ко многим Людям (то есть отношениям между многими). ​​

Комусделать это прямо в Sequelize:

Team.belongsToMany(Person, {through: 'TeamPerson'})
Person.belongsToMany(Team, {through: 'TeamPerson'})

Это создаст новую таблицу с именем TeamPerson с обоими teamId и personId.Я предполагаю, что первичный ключ этой таблицы является составной частью обоих идентификаторов.

Я также хочу, чтобы у каждой команды был капитан:

Team.belongsTo(Person {as: 'captain'})

Это добавит captainId к модели команды.

Вот моя проблема, я хочу, чтобы Человек мог создать Команду, но я не хочу, чтобы они могли создавать две команды с одинаковым именем.Однако я хочу разрешить другим лицам создавать команду с тем же именем, что и другие лица.Таким образом, у идентификатора пользователя 1 не может быть двух команд с именем «Соколы», но у идентификатора пользователя 1 может быть одна команда с именем «Соколы», а у идентификатора пользователя 2 может быть команда с именем «Соколы».

По сути, имя и captainId должны быть составным первичным ключом таблицы Team.Кто-нибудь может дать мне совет, как мне этого добиться?

1 Ответ

0 голосов
/ 06 марта 2019

Вы можете запросить ранее существующего человека / проект, прежде чем разрешить создание нового проекта ... примерно:

    Person.findAll({
        attributes: ['id'],
        include: [{
            model: Team,
            where : { name : ***TEAM_NAME_PARAM*** }
            attributes: [
                [Sequelize.fn('count', 'id'), 'number_of_teams']
           ]
        }],
        where: { id : ***USER_ID_PARAM***},
        group: ['id']
        })        
        .then(myTeams => {
            if (myTeams.length == 0 || myTeams.Team.number_of_teams == 0) {
               // proceed with creating new team
            } else {
               // give some error message (you already have a team with that name)
            }
            ...
...