Обойти уникальные ограничения Sequelize в ассоциациях TopTany - PullRequest
2 голосов
/ 24 марта 2019

Я использую Sequelize в своем проекте. Это две модели:

const User = db.define('user', {
  name: Sequelize.STRING,
  password: Sequelize.STRING
})
const Product = db.define('product', {
  name: Sequelize.STRING,
  price: Sequelize.INTEGER
})

Теперь пользователи могут приобретать продукты, и у меня есть настройки, как показано ниже:

Product.belongsToMany(User, {through: 'UserProducts'})
User.belongsToMany(Product, {through: 'UserProducts'})

У меня также есть эта таблица UserProducts с дополнительным столбцом.

const UserProducts = db.define('UserProducts', {
  status: Sequelize.STRING
})

Sequelize создает составной ключ с комбинацией userId и productId и разрешает только одну запись с комбинацией userId и productId. Так, например, userId 2 и productId 14.

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

  1. Не используйте составной ключ, вместо этого используйте совершенно новый столбец автоинкремента, используемый в качестве ключа в UserProducts.

  2. Вместо того, чтобы создавать ключ только с userId и productId, позвольте мне добавить еще один столбец в ключ, такой как status, чтобы уникальный ключ был комбинацией трех.

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

И так как мои модели / база данных уже запущены, мне нужно будет использовать миграции, чтобы внести это изменение.

Любая помощь по этому вопросу высоко ценится.

1 Ответ

3 голосов
/ 29 марта 2019

Belongs-To-Many создает уникальный ключ, когда первичный ключ отсутствует в сквозной модели.

Поскольку у вас также есть дополнительное свойство в таблице UserProducts, вам необходимо определить модель для UserProducts, а затем указать сиквелизу использовать эту модель вместо создания собственной

class User extends Model {}
User.init({
    name: Sequelize.STRING,
    password: Sequelize.STRING
}, { sequelize })

class Product extends Model {}
ProjProductect.init({
    name: Sequelize.STRING,
    price: Sequelize.INTEGER
}, { sequelize })

class UserProducts extends Model {}
UserProducts.init({
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  status: DataTypes.STRING
}, { sequelize })

User.belongsToMany(Project, { through: UserProducts })
Product.belongsToMany(User, { through: UserProducts })

см .: Sequelize v4 принадлежит ToMany

UPDATE

, поскольку вы используете v3 и уже создали модель для своей таблицы UserProducts, используйте следующий фрагмент

UserProducts = db.define('UserProducts', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  status: DataTypes.STRING
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...