Strongloop Loopback:按相关模型的ID过滤

时间:2015-03-07 10:50:43

标签: javascript angularjs node.js loopbackjs strongloop

我有一个Strongloop Loopback Node.js项目,包含一些模型和关系。

手头的问题

我的问题涉及如何仅使用Angular SDK查询与Media个ID相关的Tag个实例 - 查询Tags.media(返回Tag个实例),而是以某种方式进行查询,返回纯Media个实例。

请阅读以下具体信息..

规格

基本上,我有一个模型Media,它有许多'标签'(模型Tag)。想象一下具有各种EXIF标签(Media)的图像文件(Tag)。这是关系规范(这一切都按预期工作):

媒体(media.json):

{
  "name": "media",
  "base": "PersistedModel",
  "properties": {
    "id": {
      "type": "string",
      "id": true
    }
  },
  "relations": {
    "tags": {
      "type": "hasAndBelongsToMany",
      "model": "tag"
    }
}

Tag(tag.json):

{
  "name": "tag",
  "base": "PersistedModel",
  "idInjection": true,
  "properties": {
    "name": {
      "type": "string",
      "required": true
    }
  },
  "relations": {
    "medias": {
      "type": "hasAndBelongsToMany",
      "model": "media"
    }
  },
  "acls": [],
  "methods": []
}

解决方案

现在,我知道我可以这样做一个查询(在我的示例中使用Angular SDK,但语法是相同的):

injector.get('Tag').find({
  'filter': {
    'include': 'medias',
    'where': {'id': <mytagid>}
  }
});

我对这种方法的问题是,我收到了带有one个实例的1(TagMedia个实例。这会破坏整个工作流程的原因,因为我只处理Media个实例..我只想按Tag ID 过滤,而不是打扰Tag。< / p>

底线

如果我看到API资源管理器(/explorer/),GET /api/tags/<myTagID>/medias的返回值正是我所需要的 - 一组Media个对象 - 但是如何查询它们就像这样使用Angular SDK(lb_services)?

1 个答案:

答案 0 :(得分:3)

我有类似的问题。一个建议是打开lb-services.js并尝试查找:/ tags /:id / medias或类似的东西。然后你会发现这样的评论: // INTERNAL。请改用Tags.medias()。或类似的东西。这就是你应该调用的方法。不要调用&#34;原型$ __ get .....&#34;方法

然后只需调用它在那里所说的内容:Tag.medias({id:})

其他建议:

正如您在描述中所说,媒体有很多标签。那么为什么不使用

{
  "name": "media",
  "base": "PersistedModel",
  "properties": {
    "id": {
      "type": "string",
      "id": true
    }
  },
  "relations": {
    "tags": {
      "type": "hasMany",   <---------- hasMany
      "model": "tag",
      "foreignKey": "tagId" <---FK name
    }
  }

和 标签只是属于类型。

{
  "name": "tag",
  "base": "PersistedModel",
  "idInjection": true,
  "properties": {
    "name": {
      "type": "string",
      "required": true
    }
  },
  "relations": {
    "medias": {
      "type": "belongsTo",
      "model": "media",
      "foreignKey": "mediaId"  <---FK name
    }
  },
  "acls": [],
  "methods": []
}

但实际上我并不认为这是问题所在,因为你说当你请求GET /api/tags/<myTagID>/medias时它会返回你想要的东西。

然后,在AngularJS中,您可以使用:

 Media.tags({id:<mediaId>})

for media /:id / tags

并为另一方尝试:

Tag.medias({id:<tagId>})


Tag.find({
       filter:{
          where:{mediaId: <mediaId>}     <----mediaId comes from FK name    
       }
   })

在这种情况下,两者都是持久性模型没有问题,在使用扩展用户类型的数据执行类似操作时,我遇到了权限问题。但这是另一个故事......

希望这有用,我从我正在做的类似应用程序中更改了一些内容,并希望在适应您的代码时不会出现太多错误...