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

Strongloop Loopback: Filter by id of related Model

我有一个带有一些模型和关系的 Strongloop Loopback Node.js 项目。

手头的问题

我的问题涉及如何使用 Angular SDK - while[= 仅查询与特定 Tag id 相关的那些 Media 实例65=] 不是 查询 Tags.media (return Tag 实例),而是以某种方式进行查询 return 是普通的 Media 实例。

具体信息请阅读下文..

规格

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

媒体(media.json):

{
  "name": "media",
  "base": "PersistedModel",
  "properties": {
    "id": {
      "type": "string",
      "id": true
    }
  },
  "relations": {
    "tags": {
      "type": "hasAndBelongsToMany",
      "model": "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>}
  }
});

我对这种方法的问题是,我收到 1 (one) Tag 个实例,并附加了 Media 个实例。这打乱了为什么整个工作流程,因为我只处理 Media 个实例。我只想通过 Tag id filter,而不用担心 Tag 在全部.

底线

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

我遇到了类似的问题。一个建议是打开 lb-services.js 并尝试查找:/tags/:id/medias 或类似的东西。然后你会发现这样的评论:// INTERNAL。请改用 Tags.medias()。 或类似的东西。这就是您应该调用的方法。不要调用 "prototype$__get....." 方法。

然后就按照我想的那样调用:Tag.medias({id:})

其他建议:

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

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

和 对于标签只是 belongsTo 作为类型。

{
  "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 它 returns 你想要什么。

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

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

媒体/:id/tags

另一边试试:

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


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

在这种情况下,两者都是持久模型,没有问题,我在对扩展用户类型的数据做类似的事情时遇到了权限问题。但那是另外一回事了...

希望这对您有所帮助,我从我正在做的类似应用程序中更改了一些东西,希望在适应您的代码时不会犯太多错误...