Loopbackjs strong循环-hasOne关系

Loopbackjs strong循环-hasOne关系,loopbackjs,strongloop,has-one,Loopbackjs,Strongloop,Has One,我在建立hasOne关系方面遇到了一些麻烦,这可能是因为我错误地理解了这种关系 我有两个模型,一个用户模型和一个位置模型。我现在要添加的是用户和位置之间的关系,这意味着用户有一个当前位置。但是如果我在用户模型上设置了一个hasOne与位置的关系,那么我最终会在位置中得到一个userId属性。但这是完全错误的,因为多个用户可以拥有相同的当前位置,所以用户模型应该存储位置id,而不是用户id所在的位置。那么,我如何实现我想要的,以便以后可以查询用户并包括当前位置 当然,我可以向用户添加一个属性,并将

我在建立hasOne关系方面遇到了一些麻烦,这可能是因为我错误地理解了这种关系

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


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

关系名称指的是“hasine”的关系含义,这意味着对于每个用户,location表中都有一个(并且只有一个)条目。每个用户在位置表中“有一个”条目,如果您的数据需要显示两个用户具有相同的位置,则这意味着位置表将使用不同的用户ID存储相同的位置数据。这对于关系映射来说仍然很好,并且允许您进行User.location调用

您要查找的内容稍有不同,即“Location hasMany Users”,因为您将与多个用户共享Location条目。将此理解为“对于每个位置条目,许多用户都可以共享它。”当您希望返回包含位置数据的用户时,您必须以稍微不同的方式进行查询,并使用
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的帖子的评论,您的问题有点不清楚,但是如果您确实需要用户共享一组给定的位置,那么您最好使用
User
belongsTo
location

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


最后,您可以设置一个
位置
hasMany
用户
从给定位置检索所有用户

非常感谢您的解释,现在它确实更有意义了。是的,看来你的解决方案就是我想要的。但是你说我可以使用include过滤器来获取用户对象的位置,但这似乎对我不起作用。我只得到一个错误
关系\“location\”没有为用户模型定义
,这是有意义的,因为关系现在是在位置模型上定义的,而不是在用户模型上定义的。当然,我可以在第二次呼叫中使用locationId来获取位置,但是如果一次呼叫可以,那就太好了。谢谢为了简化并能够使用将附加到模型的内置方法,只需使用用户具有一个位置关系并使用不同的用户ID存储相同的位置。确保这会使用更多的存储空间,但这在总体方案中并不多(假设位置仅为几列值或lat/long)。您正在用一点点额外的存储空间换取更少的代码/复杂性。谢谢,不幸的是,我还有其他与位置模型有关系的模型,因此我不想为每个用户创建同一位置的新实例,然后也必须相应地更新所有其他关系。但是没关系,我会在一个单独的调用中使用locationId来获取位置,或者在一个调用中使用远程钩子来提供位置;我以为我尝试了一个属于
关系的
,但一定是切换了模型,或者忘了清除旧模式。