确保LoopBack模型中字段值的唯一性

21
如何确保Loopback模型中特定字段的唯一性。像下面这个Post模型,我有一个名为genericId的字段,我希望它在数据库中是唯一的,并且当发生重复键插入时,Loopback会抛出错误。
{
  "name": "Post",
  "plural": "Post",
  "base": "PersistedModel",
  "properties": {
    "genericId": {
      "type": "string",
      "required":True 
    },
    "moderatedAt": {
      "type": "date"
    }
  },
  "validations": [],
  "acls": [],
  "methods": []
}

我已经尝试搜索了他们的文档和其他示例,但没有成功。 我能想到的一个解决方案是,为创建函数创建一个remoteHook,在插入之前验证该字段,但我正在寻找其他方法。


你也可以直接在数据库上强制实现唯一性。 - Ravi
2
是的,Strongloop的LoopbackJS文档令人难以忍受。 - Green
3个回答

30

我不确定这是否是实现唯一性的最佳方法,但您可以在此处找到有关为模型创建索引的文档。

只需在要求唯一性的字段上添加一个唯一索引,就完成了!

对于你的模型,应该这样做:

{
  ...
    "genericId": {
      "type": "string",
      "required": True,
      "index": {"unique": true} 
    },
 ...
}

然而,如果genericId字段是模型实际的ID,我建议你将其声明为这样,这样你就可以使用findById方法,并避免创建一个重复的id字段,如果您在模型中不声明任何字段,这种情况将发生。

{
  ...
    "genericId": {
      "type": "string", 
      "id": true,       // Ensure uniqueness and avoid another model id field
      "generated": true // Add this if you want Loopback to manage id content for you
    },
 ...
}

你能详细解释一下"将它声明为这样"的意思吗?谢谢。 - CNSKnight
注意:这是一篇旧帖子,不确定其是否仍然有效。在上述消息中,代码扩展了解释:通过在字段JSON定义中设置“id”属性(为“true”),将字段声明为模型ID。 - Pandaiolo

28

common/models/post.js中设置验证规则

Post.validatesUniquenessOf('genericId');

谢谢你的解决方案,但我已经得到了,抱歉忘记在这里更新。 - Nishant
2
正确的验证文档 https://docs.strongloop.com/display/APIC/Validating+model+data - EFernandes
5
仅支持以下连接器:内存、Oracle或MongoDB。 - EFernandes
2
如果我想要保持字段组合的唯一性怎么办? - Virendra Singh Rathore

10

回顾v4方案如下:

@model()
export class Client extends Entity {

  @property({
    type: 'string',
    required: true,
    index: {
      unique: true,
    },
  })
  name: string;

}

然后您必须更新架构:

npm run migrate

或重新创建它:

npm run migrate -- --rebuild

你更新了数据库的结构吗?是使用 npm run migrate 还是 npm run migrate -- --rebuild 命令呢? - Mathias Arens
并非每个连接器都支持此功能。我已经为PostgreSQL进行了检查。我想MySQL也是支持的。 - Mathias Arens
谢谢Mathias,这正是我一直在寻找的。已在PostgreSQL中进行了测试。顺便说一句,它没有为响应发送良好的错误消息。现在的错误响应只会是500。你们有没有关于编辑它的参考资料?谢谢! - Irfandy Jip
在我看来,这个答案更优雅,也是 Mongo 驱动程序的正确答案。 - ddsultan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接