Strongloop - hasOne关系

时间:2016-01-07 11:55:41

标签: loopbackjs strongloop has-one

我在设置一个hasOne关系时遇到了一些麻烦,这可能是因为我错误地理解了这种关系?

我有2个模型,一个用户模型和一个位置模型。我现在想要添加的是用户和位置之间的关系,这意味着用户具有当前位置。但是如果我在用户模型上使用该位置设置了一个hasOne关系,我最终会在该位置使用userId属性。但这是完全错误的,因为几个用户可以拥有相同的当前位置,因此用户模型应该存储位置ID,而不是用户ID的位置。那么我怎样才能实现我想要的,以便我可以事后查询用户并包含当前位置?

我当然可以向用户添加属性并在那里存储位置的id,但是我不能轻易地在用户请求中包含该位置。所以我更愿意使用关系来实现这一点。

2 个答案:

答案 0 :(得分:3)

考虑到Brian的帖子的评论,你的问题有点不清楚,但如果你绝对需要用户分享给定的一组位置,那么你最好使用User {{1} } belongsTo

这将在location中创建locationId字段,您将能够User GET

最后,您可以设置api\Users\{userId}\location location hasMany从指定位置检索其中的所有用户

答案 1 :(得分:2)

关系名称是指&#34的关系含义;有一个,"这意味着对于每个用户,位置表中存在一个(且只有一个)条目。每个用户都有一个"在位置表中输入,如果您的数据需要显示两个用户具有相同的位置,则只表示位置表将存储具有不同userIds的相同位置数据。这对于关系映射来说仍然完美无缺,并且允许您进行User.location调用。

您正在寻找的内容略有不同,这将是"位置 hasMany 用户,"因为您将与多个用户共享位置条目。阅读本文为"对于每个位置条目,许多用户可以共享它。"当您想要返回包含位置数据的用户时,您必须以不同的方式查询并使用include: ['location']过滤器(否则您只会获得locationId值)。

关系构建器:

$ slc loopback:relation
? Select the model to create the relationship from: Location
? Relation type: has many
? Choose a model to create a relationship with: user
? Enter the property name for the relation: users
? Optionally enter a custom foreign key:
? Require a through model? No

location.json:

{
  "name": "Location",
  "base": "PersistedModel",
  "idInjection": true,
  "options": {
    "validateUpsert": true
  },
  "properties": {
    "lat": {
      "type": "number"
    },
    "long": {
      "type": "number"
    }
  },
  "validations": [],
  "relations": {
    "users": {
      "type": "hasMany",
      "model": "user",
      "foreignKey": "locationId"
    }
  },
  "acls": [],
  "methods": {}
}