我在设置一个hasOne关系时遇到了一些麻烦,这可能是因为我错误地理解了这种关系?
我有2个模型,一个用户模型和一个位置模型。我现在想要添加的是用户和位置之间的关系,这意味着用户具有当前位置。但是如果我在用户模型上使用该位置设置了一个hasOne关系,我最终会在该位置使用userId属性。但这是完全错误的,因为几个用户可以拥有相同的当前位置,因此用户模型应该存储位置ID,而不是用户ID的位置。那么我怎样才能实现我想要的,以便我可以事后查询用户并包含当前位置?
我当然可以向用户添加属性并在那里存储位置的id,但是我不能轻易地在用户请求中包含该位置。所以我更愿意使用关系来实现这一点。
答案 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": {}
}