Есть два решения
1. Использование мудрой проверки модели и добавление проверочного ограничения в базу данных вручную:
Проверка мудрости модели:
const FollowingModel = sequelize.define("following", {
userId: {
type: Sequelize.INTEGER,
// .. other configuration like `allowNull`
},
followingId: {
type: Sequelize.INTEGER,
// .. other configuration like `allowNull`
}
}, {
validate: {
userShouldNotFollowSelf : function() {
if(this.userId === this.followingId) {
throw Error("User should not follow self") // Use any custom error class if your application has such class.
}
}
}
}
Осторожно, это позволит вам создать запись в базе данных, которая не поддерживает это ограничение.
Это просто проверка уровня приложения ORM, что это приложение не разрешит ввод, где userId
и followingId
не совпадают.
Mysql уровень базы данных проверка ограничения .
CREATE TABLE `following`
(
`userId` INT NOT NULL,
`followingId` INT NOT NULL,
CONSTRAINT `no_self_following` CHECK (`userId` <> `followingId`)
-- other properties and foreign key constraints.
);
Это обеспечит отсутствие вставки такой записи, если userId
и followingId
совпадают.
2. Объявление ограничения в интерфейсе запросов sequelize.
Для этого необходимо объявить модель с использованием интерфейсов запросов addConstraint следующим образом
sequelize.getQueryInterface().addConstraint("following", ['userId'], {
type: 'check',
name: "no_self_following"
where: {
userId: {
[Sequelize.Op.ne]: Sequelize.col("followingId")
}
}
});
Запустите это, пока все модели базы данных синхронизированы правильно , Это добавит ограничение уровня базы данных.
Какой из них использовать?
Подход № 1 более эффективен. Это проверка внутри приложения без входа в базу данных, делает вашу базу данных менее занятой.