19

How to ensure uniqueness of a particular field in loopback model. Like below is the model Post, I have a field genericId in it, I want it to be unique in the database, and loopback to through an error, on duplicate key insertion.

{
  "name": "Post",
  "plural": "Post",
  "base": "PersistedModel",
  "properties": {
    "genericId": {
      "type": "string",
      "required":True 
    },
    "moderatedAt": {
      "type": "date"
    }
  },
  "validations": [],
  "acls": [],
  "methods": []
}

I have tried searching there documentation, and other examples but no success. One solution which I can think of is, to create a remoteHook for the create function, and validate this field before inserting, but looking for some other way.

Skynet
  • 5,640
  • 5
  • 37
  • 46
Nishant
  • 3,424
  • 1
  • 16
  • 26

3 Answers3

30

Not sure if it is the better way to achieve uniqueness, but you can find here the docs about indexing your model.

Just add a unique index on the field you want, and voila !

For your model, that would be :

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

However, if the genericId field is the actual Id of the model, I suggest you declare it as such, so you can use findById method, and also avoid creation of a duplicate id field, which will happen if you don't declare any in your model.

{
  ...
    "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
    },
 ...
}
Pandaiolo
  • 8,301
  • 4
  • 31
  • 64
  • Could you expend on "...declare it as such"? Thanks. – CNSKnight Dec 19 '16 at 17:54
  • *Note: this is an old post, not sure if its still valid*. In the above message, the code expands on the explanation : you declare a field as a model ID by setting the `id` prop (to `true`) in the field json definition. – Pandaiolo Dec 20 '16 at 18:34
27

Set validation rule in your common/models/post.js

Post.validatesUniquenessOf('genericId');
Acapulco
  • 2,847
  • 8
  • 35
  • 44
IvanZh
  • 2,205
  • 1
  • 16
  • 25
7

The Lookback v4 solution looks like this:

@model()
export class Client extends Entity {

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

}

Then you must update your schema:

npm run migrate

or recreate it:

npm run migrate -- --rebuild
Mathias Arens
  • 105
  • 2
  • 5