Strongloop - hasOne 关系

Strongloop - hasOne relation

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

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

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

关系名指的是"has one,"的关系含义,即对于每个用户,在位置table中存在一个(并且只有一个)条目。位置 table 中的每个用户 "has one" 条目,如果您的数据需要显示两个用户具有相同的位置,这仅意味着位置 table 将存储具有不同用户 ID 的相同位置数据.这对于关系映射来说仍然非常好,并且允许您进行 User.location 次调用。

您要查找的内容略有不同,应该是 "Location hasMany Users,",因为您将与多个用户共享位置条目。将此解读为 "for each location entry, many users could share it." 当您想要 return 包含位置数据的用户时,您必须以不同的方式进行查询并使用 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": {}
}

考虑到 Brian 的 post 的评论,您的问题有点不清楚,但是如果您绝对需要用户共享一组给定的位置,那么您最好使用 User belongsTo location.

这将在 User 中创建一个 locationId 字段,您将能够 GET api\Users\{userId}\location

最终,您可以设置 location hasMany User 以从给定位置检索那里的所有用户