Sequelize Уникальное ограничение по двум таблицам - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть три таблицы: survey, survey_owners (присоединяемая таблица), пользователи. Обзоры, естественно, имеют названия и принадлежат пользователям. Пользователь может иметь несколько опросов, а опрос может принадлежать нескольким пользователям (отношение «многие ко многим»).

У меня есть уникальная настройка ограничения в таблице survey_owners, поэтому нет дубликатов, но теперь необходимо выяснить, как применить уникальное ограничение для решения следующих задач: пользователь не должен иметь возможность владеть несколькими опросами с одинаковым названием .

При этом уникальное ограничение НЕ МОЖЕТ быть помещено в столбец «заголовок» таблицы опросов, поскольку уникальность должна применяться только в том случае, если пользователь уже владеет опросом с идентичным именем.

Есть идеи, как реализовать это в Sequelize миграции и / или модели (ях)?

Текущий файл миграции для survey_owners

'use strict';
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable('survey_owners', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      surveys_id: {
        type: Sequelize.INTEGER,
        onDelete: 'CASCADE',
        references: {
          model: 'surveys',
          key: 'id'
        }
      },
      users_id: {
        type: Sequelize.INTEGER,
        references: {
            model: 'users',
            key: 'id'
        }
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
        field: "created_at"
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
        field: "updated_at"
      }
    })
    .then(() => {
      return queryInterface.addConstraint('survey_owners', ['surveys_id', 'users_id'], {
          type: 'unique',
          name: 'survey_owners'
      });
    });
  },
  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable('survey_owners');
  }
};

1 Ответ

0 голосов
/ 08 мая 2019

К сожалению, я не смог найти способ внутри Sequelize справиться с этим ограничением, поэтому я обрабатываю логику действия submit и проверяю в методе JS. Не лучшим образом, но пришлось двигаться дальше, и это работает.

...