Reputation: 3694
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.
Upvotes: 21
Views: 17231
Reputation: 317
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
Upvotes: 10
Reputation: 2290
Set validation rule in your common/models/post.js
Post.validatesUniquenessOf('genericId');
Upvotes: 28
Reputation: 11568
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
},
...
}
Upvotes: 30