我有两个模型:Account
和Customer
都有一个电子邮件地址。
如果没有Account
,则Customer
可以存在,而Customer
可以存在Account
。{
但是,Account
应返回相关的Customer
记录(如果存在)
我正在考虑通过使用两个记录中可用的唯一标识符(电子邮件地址)作为foreignKey在hasOne
上创建Account
关系来实现此目的。
不幸的是,这不起作用
这些是我的模特:
帐户
...
"properties": {
"username": {
"type": [
"string"
]
},
"email": {
"type": "string"
}
},
"validations": [],
"relations": {
"customer": {
"type": "hasOne",
"model": "Customer",
"foreignKey": "email"
}
}
...
客户
...
"properties": {
"name": {
"type": [
"string"
]
},
"email": {
"type": "string"
}
},
"validations": [],
"relations": {}
...
致电/api/account?filter={"include": ["customer"]}
我没有收到任何其他信息
我不明白问题是foreignKey还是关系。
答案 0 :(得分:2)
您可以在返回请求的实例之前使用afterRemote hook进行封送处理。
然而,这不是自动的,即你仍然需要提供某种id来将两个实例链接在一起。在您的情况下,如果电子邮件是这样的ID,那么您只需使用与Account实例相同的电子邮件搜索Customer实例。
优点是您不需要为查询提供任何额外的过滤器或其他任何内容。
e.g。
Account.afterRemote('find', function(ctx, modelInstance, next) {
// Here you can check if the Account instance has a Customer instance
// via a regular find or findById, and if you do find the related instance
// you can add the data to ctx.result, which is the object that will be returned.
Customer.find({where:{email: modelInstance.email}}, addCustomerDetails);
function addCustomerDetails(err, linkedCustomer) {
// Add the Customer to the Account instance here
ctx.result.customer = linkedCustomer;
next();
}
});
当然,您可以在Customer afterRemote挂钩中执行相同操作,而是搜索关联的帐户实例电子邮件。
答案 1 :(得分:1)
您的模型定义良好。
确保您在db。中有现有电子邮件的客户实例。
正确的休息api呼叫是:/api/account?filter[include]=customer
<强>更新强>
由于关系,Loopback会覆盖email
的类型。 hasOne
关系应设置在id
外键而不是任何其他字段上。
因此,如果您想解决问题,则需要在account
定义的属性部分中添加以下内容:
"id": false,
"email": {
"type": "string",
"id": true
}
答案 2 :(得分:0)
foreignKey
字段只是关系的别名。拥有email
属性并将email
设置为foreignKey
不会在两者之间创建任何类型的链接。
然后,只需使用REST API来实例化模型,设置关系并获取数据
POST api/accounts/
{
"email": "account@bar.com"
}
POST api/accounts/1/foreignKey
{
"email": "customer@bar.com"
}
GET api/accounts/1?filter[include]=foreignKey