通过模型设置创建唯一的多键索引

时间:2018-12-19 12:58:53

标签: sails.js

我正在使用Sails v1.1-

我在此处的帆文档-https://sailsjs.com/documentation/concepts/models-and-orm/associations/through-associations

下通过自定义模型关联创建了多对多

PetUser模型具有两列petuser,其中每一列都是各自的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模型的ownerpet属性中同时添加PetUser,但是只有第一个unique: true得到尊重。

这是我在myApp/api/models/PetUser.js中的代码

module.exports = {
  attributes: {
    owner: {
      model:'user',
      unique: true
    },
    pet: {
      model: 'pet',
      unique: true
    }
  }
}

1 个答案:

答案 0 :(得分:1)

为实现类似的行为,我添加了一个组合属性并将其标记为唯一。另外,我添加了beforeCreatebeforeUpdate模型钩子,在这些钩子上生成组合属性以检查其是否唯一。

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