Strongloop环回:根据相关模型的id进行过滤

Strongloop Loopback: Filter by id of related Model

本文关键字:id 过滤 模型 环回 Strongloop      更新时间:2023-09-26

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

眼前的问题

我的问题涉及如何使用Angular SDK-只查询那些与某个Tag id有关系的Media实例,而不查询Tags.media(返回Tag实例),而是以某种方式进行查询,返回普通的Media实例。

有关具体信息,请阅读以下内容。。

规格

基本上,我有一个型号Media,它有很多"标签"(型号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个(oneTag实例,其中附带了Media实例。这扰乱了为什么整个工作流程,因为我只处理Media实例。。我只想通过Tagid过滤,根本不关心Tag

底线

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

我也遇到了类似的问题。一个建议是打开lb-services.js并尝试查找:/tags/:id/medias或类似的东西。然后你会发现这样的评论://内部。请改用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
    }
  }

以及对于只属于To类型的标记。

{
  "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>})

对于介质/:id/标签

另一方尝试:

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

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

在这种情况下,两者都是持久模型——没有问题,我在对扩展User类型的数据进行类似操作时遇到了权限问题。但那是另一回事。。。

希望这是有帮助的,我从我正在做的类似应用程序中更改了一些内容,并希望在适应你的代码时不要犯那么多错误。。。