在hasOne关系中包含相关模型

时间:2016-12-22 12:43:44

标签: loopbackjs strongloop

我有两个模型:AccountCustomer都有一个电子邮件地址。 如果没有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还是关系。

3 个答案:

答案 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"
}

获取accound并包含相关客户

GET api/accounts/1?filter[include]=foreignKey