Сбой продолжения уникальных композитов

#sequelize.js

#sequelize.js

Вопрос:

У меня есть следующие таблицы:

 class Occurrence extends Model {}
Occurrence.init({
  date: {
    type: DataTypes.DATE,
    allowNull: false,
    defaultValue: Sequelize.NOW,
    unique: 'uniqueOccurrence'
  }
}, {
  sequelize,
  modelName: 'Occurrence'
});

class Event extends Model {}
Event.init({
  title: {
    type: DataTypes.STRING,
    allowNull: false,
  },
}, {
  sequelize,
  modelName: 'Event'
});

 

Со следующей ассоциацией:

 Event.hasMany(Occurrence, { onDelete: 'CASCADE', foreignKey: { unique: 'uniqueOccurrence' } });
Occurrence.belongsTo(Event);
 

Я пытаюсь создать составное уникальное ограничение, которое в основном терпело бы неудачу только тогда, когда оба occurrence.date и Event.id все вместе не являются уникальными.

Обновить

Предполагается, что композит находится в `появлении.Событие not event.id `

Однако по какой-то причине это не удается.

Ответ №1:

Если вы хотите создать уникальный индекс с двумя полями, и одно из них является внешним ключом, вы должны определить его явно, чтобы иметь возможность указывать то же уникальное имя индекса, которое указано в date поле:

 EventId: {
    type: DataTypes.INTEGER,
    allowNull: false,
    unique: 'uniqueOccurrence'
},
date: {
    type: DataTypes.DATE,
    allowNull: false,
    defaultValue: Sequelize.NOW,
    unique: 'uniqueOccurrence'
}
 

и также исправьте ассоциацию:

 Event.hasMany(Occurrence, { onDelete: 'CASCADE', foreignKey: 'EventId' });
Occurrence.belongsTo(Event, { foreignKey: 'EventId' });
 

Если вы хотите использовать два поля в качестве внешнего ключа, то Sequelize не может этого сделать (и foreignKey опция не имеет unique prop).

Комментарии:

1. Анатолий, я имею в виду, occurrence.EventId поле. не event.id

2. Хорошо, ответ также был изменен

3. Анатолий, это работает. Есть ли способ настроить сообщение об ошибке? Я пробовал unique: { args: 'uniqueOccurrence', msg: 'You cannot add the same date' }

4. Я не использовал эти параметры. unique Не сработало вообще?

5. Нет, они вообще отменили ограничение.