21

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.

Arnab Nandy
  • 6,472
  • 5
  • 44
  • 50
Nishant
  • 3,614
  • 1
  • 20
  • 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
  • 11,165
  • 5
  • 38
  • 70
  • 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
28

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

Post.validatesUniquenessOf('genericId');
Acapulco
  • 3,373
  • 8
  • 38
  • 51
IvanZh
  • 2,265
  • 1
  • 18
  • 26
10

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
  • 317
  • 5
  • 9
  • Did you update your schema? `npm run migrate` or `npm run migrate -- --rebuild`? – Mathias Arens Oct 09 '19 at 21:12
  • Not every connector might support this. I checked it for PostgreSQL. MySQL is supported, too, I guess. – Mathias Arens Oct 09 '19 at 21:20
  • Thank you Mathias, this is what I've been looking for. Tested in PostgreSQL. Btw, it doesn't send a good error message for the response. The error response now would only be 500. Does any of you have reference for editing that? Thank you! – Irfandy Jip Jul 02 '21 at 03:04
  • This answer is more elegant and also correct one for Mongo Driver, in my opinion – ddsultan Jan 19 '22 at 21:33