2016-01-07 21 views
1

我在设置hasOne关系时遇到了一些麻烦,这可能来自我理解错误的关系?Strongloop - hasOne relation

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

我当然可以给用户添加一个属性并存储该位置的ID,但是我不能在用户请求中轻松地包含该位置。所以我宁愿使用关系来实现这一点。

回答

3

你的问题是有点不清楚,因为Brian的文章的评论,但如果你确实需要的用户共享一组给定的地点,那么你会更好使用UserbelongsTolocation

这将在User创建locationId领域,你将能够GETapi\Users\{userId}\location

最后,你可以设置一个locationhasManyUser从给定的位置在那里获取所有用户

+1

这比我的答案要直截了当,我以为我尝试过'belongsTo'关系,但是必须已经切换模型或忘记清除旧模式。 – Brian

+0

谢谢,这个作品完美。 – dominik

2

关系名称是指“有一个”的关系含义,这意味着对于每个用户,在位置表中存在一个(且只有一个)条目。每个用户在位置表中都有“一个”条目,并且如果您的数据需要显示两个用户具有相同的位置,则意味着位置表将存储具有不同用户ID的相同位置数据。这对于关系映射来说仍然非常好,并且允许您执行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": {} 
} 
+0

谢谢很多的解释,它现在确实更有意义。是的,看来你的解决方案就是我正在寻找的。但是你说我可以使用包含过滤器来获取用户对象的位置,但似乎对我无效。我只收到一个错误'Relation \'location \“没有为用户模型定义',这种情况是有道理的,因为现在在Location模型中定义了关系,而不是用户模型。我当然可以在第二个电话中使用locationId来获取位置,但是如果可能只有一个电话会很好。谢谢! – dominik

+0

为了简化并且能够使用内置的方法来连接到模型,只需使用User hasOne Location关系并使用不同的用户ID存储相同的位置即可。当然,这需要更多的存储空间,但是这并不是什么大事(假设位置只是几列或者经纬度)。您只需要少量的代码/复杂性即可获得额外的存储空间。 – Brian

+0

谢谢,不幸的是我有其他与位置模型有关系的模型,所以我不想为每个用户创建相同位置的新实例,然后必须相应地更新我的其他关系。但没关系,我只需在单独的调用中使用locationId来获取位置,或者可以使用远程挂钩在单个调用中提供它。 – dominik