我有一些“邀请”模型:
'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‘的组合都会创建一个索引。例如,invite、{userFromId:1,userToId:2}和{userFromId:2,userToId:1}必须具有相同的索引。
我使用sequelize: 3.29.0和mysql。
发布于 2017-01-28 04:11:47
使用数据库索引是不可能的,因为[1, 2] != [2, 1]。如果您想强制这种类型的唯一性,一种选择是创建一个具有唯一索引的新字段,并将它的值设置为lower + : + higher,这样在上面的示例中,您总是以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'],
}]
}
);
}您可以在这里看到defualtValue是如何计算的,无论ID的顺序如何,键/结果都是相同的:
[1,2].sort().join(':');
"1:2"
[2,1].sort().join(':');
"1:2"https://stackoverflow.com/questions/41898072
复制相似问题