我正在使用Sails v1.1-
我在此处的帆文档-https://sailsjs.com/documentation/concepts/models-and-orm/associations/through-associations
下通过自定义模型关联创建了多对多 PetUser
模型具有两列pet
和user
,其中每一列都是各自的ID。我想创建一个唯一的多键索引,这意味着不能有两行具有相同的“宠物和用户”组合。意味着第二次调用应该成功,而第三次调用应该失败,并显示唯一性错误:
await PetUser.create({ user: 1, pet: 33 }); // should succeed
await PetUser.create({ user: 1, pet: 44 }); // should succeed as user/pet combination is different
await PetUser.create({ user: 1, pet: 33 }); // should fail
我尝试在下面的unique: true
模型的owner
和pet
属性中同时添加PetUser
,但是只有第一个unique: true
得到尊重。
这是我在myApp/api/models/PetUser.js
中的代码
module.exports = {
attributes: {
owner: {
model:'user',
unique: true
},
pet: {
model: 'pet',
unique: true
}
}
}
答案 0 :(得分:1)
为实现类似的行为,我添加了一个组合属性并将其标记为唯一。另外,我添加了beforeCreate
和beforeUpdate
模型钩子,在这些钩子上生成组合属性以检查其是否唯一。
const YourModel = {
attributes: {
owner: {
model: 'user',
},
pet: {
model: 'pet',
},
petOwner: {
type: 'string',
unique: true,
}
},
beforeCreate : function(values,cb) {
// TODO get ids from related records or reset to default on missed relation record if you need it
const petId = 35;
const ownerId = 8;
values.petOwner = `${petId}-${ownerId}`;
cb();
},
beforeUpdate : function(values,cb) {
YourModel.beforeCreate(values, cb)
},
};
module.exports = YourModel;
结果是,当您尝试添加具有相同关系的记录时,您将得到预期的E_UNIQUE
。