#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. Нет, они вообще отменили ограничение.