使索引在环回中对模型唯一

Make index unique of a model in loopback

这是我的模型的样子

  "name": "mClass",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "mClassName": {
      "type": "string",
      "required": true,
      "index": {
        "unique": true
      }
    },
    "mClassUrl": {
      "type": "string"
    },
    "mCreatedBy": {
      "type": "string",
      "required": true
    },
    "mCreatedAt": {
      "type": "date",
      "required": true,
      "default": "$now"
    },
    "mUpdatedAt": {
      "type": "date"
    },
    "mDeletedAt": {
      "type": "date"
    }
  },
  "validations": [],
  "relations": {},
  "acls": [
    {
      "accessType": "*",
      "principalType": "ROLE",
      "principalId": "$unauthenticated",
      "permission": "DENY"
    }
  ],
  "methods": {}
}

我想让 class 名称独一无二。我尝试了 index:{unique:true} 但它似乎不起作用,因为我仍然可以创建具有相同名称的 classes。请帮助我进行哪些更改。

来自docs

id No Boolean Whether the property is a unique identifier. Default is false. See Id property below.

所以我假设您必须使用 id: true 而不是 index: {...}。

您需要做的是在 model.json:

中定义索引
"indexes": {
  "indexName": {
    "keys": {
      "mClassName": 1
    },
    "options": {
      "unique": true
    }
  }
}

然后你需要在服务器启动时运行在你的数据源上自动更新,最好的地方是启动脚本,例如。 ./server/boot/db-autoupdate.js:

'use strict';

module.exports = async function(app) {
  // this will trigger the database structure update, like creating indexes (which is not handled by auto-migrate module
  await app.dataSources.db.autoupdate();
};

或者,在您的 mClass.js 中,您可以执行以下操作:

module.exports = function (mClass) {

    mClass.validatesUniquenessOf('mClassName');

};

以防有人正在寻找解决此问题的 Loopback v4 解决方案。在 Loopback v4 中,您将 @属性 注释修改为 "index: {unqiue: true}":

@model()
export class Client extends Entity {

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

}

那么您必须更新架构:

npm run migrate

或重新创建它:

npm run migrate -- --rebuild

PostgresQL 是支持的,MySQL,我猜也是