我有一些'邀请'模型:
'use strict';
export default function (sequelize, DataTypes) {
return sequelize.define('Invite', {
userFromId: {
type: DataTypes.INTEGER,
modal: 'User',
key: '_id',
onDelete: 'cascade'
},
userToId: {
type: DataTypes.INTEGER,
modal: 'User',
key: '_id',
onDelete: 'cascade'
},
accept1: {
type: DataTypes.BOOLEAN,
defaultValue: false
},
accept2: {
type: DataTypes.BOOLEAN,
defaultValue: false
}
},{
indexes: [
{
name:'id',
unique: true,
fields: ['userFromId','userToId'],
}]
}
);
}
当我要创建一个新的' Invite','userFromId'的组合时,我需要这样做。和' userToId'创建一个索引,无论谁被邀请。例如,邀请{userFromId:1,userToId:2}
和{userFromId:2,userToId:1}
必须具有相同的索引。
我使用sequelize:3.29.0和mysql。
答案 0 :(得分:0)
使用数据库索引是不可能的,因为[1, 2] != [2, 1]
。如果要强制实施此类唯一性,一个选项是创建一个具有唯一索引的新字段,并将其值设置为lower + : + higher
,以便在上面的示例中始终以{{1 }}
1:2
您可以在此处查看// Create a field called 'uniqueKey' set to the sorted IDs
export default function (sequelize, DataTypes) {
return sequelize.define('Invite', {
// ... other fields
uniqueKey: {
type: DataTypes.String,
allowNull: false,
defaultValue: function() {
// create an array of the IDs, sort, then join with :
return [
this.getDataValue('userFromId'),
this.getDataValue('userToId'),
].sort().join(':');
},
},
// ... other fields
},{
indexes: [
{
name:'uniqueKey',
unique: true,
fields: ['uniqueKey'],
}]
}
);
}
的计算方式,无论ID的顺序如何,键/结果都相同:
defualtValue