我对loopback.io
的belongsTo关系函数感到有点困惑因此,让我们采取以下示例:
我有一个名为项目的模型,该模型与客户对象有关。所以项目属于客户。
这是我的项目模型
{
"name": "Project",
"plural": "Projects",
"base": "PersistedModel",
"strict": false,
"idInjection": false,
"options": {
"validateUpsert": true
},
"properties": {
"title": {
"type": "string",
"required": true
},
"description": {
"type": "string"
},
"dateCreated": {
"type": "date"
}
},
"validations": [],
"relations": {
"customer": {
"type": "belongsTo",
"model": "Customer",
"foreignKey": "customerId"
}
},
"acls": [],
"methods": {}
}
因此,当我运行应用程序并转到http://0.0.0.0:3000/explorer时,我可以看到API。但是当我去项目时我只看到
GET /Projects/{id}/customer Fetches belongsTo relation customer.
我还期待其他功能,比如
POST /Projects/{id}/customer
DELETE /Projects/{id}/customer
为什么这里没有?或者我如何通过REST API为项目设置客户?
答案 0 :(得分:3)
让我们首先了解 belongsTo 关系,了解为什么只创建GET休息端点:
GET /Projects/{id}/customer Fetches belongsTo relation customer.
为什么Loopback没有创建以下链接:
POST /Projects/{id}/customer
DELETE /Projects/{id}/customer
belongsTo
关系会在两个模型实例之间创建一对一的关系。它用于将一个实例的所有权提供给另一个实例。在您的情况下,项目模型实例属于客户模型实例。现在,由于项目属于客户,因此客户拥有项目实例以及其他端点的解释。
GET /Projects/{id}/customer Fetches belongsTo relation customer.
由于客户可以拥有项目实例,因此上述内容是有效的,因为客户可以获取项目。
POST /Projects/{id}/customer
DELETE /Projects/{id}/customer
由于客户不属于项目而不属于项目,因此上述休息端点在创建或拒绝其所有者(客户)的项目时没有意义。
答案 1 :(得分:2)
首先,您的Project模型缺少您为belongsTo关系提到的customerId字段。
这是项目模型
{
"name": "Project",
"plural": "Projects",
"base": "PersistedModel",
"strict": false,
"idInjection": false,
"options": {
"validateUpsert": true
},
"properties": {
"title": {
"type": "string",
"required": true
},
"description": {
"type": "string"
},
"dateCreated": {
"type": "date"
},
"customerId": {
"type": "string",
"required":true
},
"validations": [],
"relations": {
"customer": {
"type": "belongsTo",
"model": "Customer",
"foreignKey": "customerId"
}
},
"acls": [],
"methods": {}
}
现在,您的客户模型还应该包含 hasMany 关系的其他部分。没有它,它将无法按预期工作。
以下是客户模型的代码
{
"name": "Customer",
"plural": "Customers",
"base": "PersistedModel",
"strict": false,
"idInjection": false,
"options": {
"validateUpsert": true
},
"properties": {
"name": {
"type": "string",
"required": true
},
"email": {
"type": "string",
"required": true
},
"dateCreated": {
"type": "date"
}
},
"validations": [],
"relations": {
"projects": {
"type": "hasMany",
"model": "Project",
"foreignKey": "customerId"
}
},
"acls": [],
"methods": {}
}
现在来自客户< - >的双方关系项目已定义,您的API应具有以下端点:
GET Customers/{id}/Projects
POST Customers/{id}/Projects
PUT Customers/{id}/Projects
您提到的端点无效,因为您无法为项目创建客户,但其他方式。
答案 2 :(得分:0)
据我所知,它并不像那样。要创建链接,您需要创建客户,然后将该客户的ID用作项目模型中的ID。
所以您的API调用将是:
POST / Customer
创建Customer,然后是
POST / Project
创建项目。
在第二篇文章中,您需要指定CustomerId以将项目链接到客户,或者您需要在事后用customerId更新项目。
然后:
项目/ {ID} /客户
检索属于项目的客户。
或者您可以在其中一个模型上编写自己的远程方法,以便在一次调用中执行此操作。
关系API的完整列表可以在这里找到: