2015-10-02 148 views
2

我目前正在研究我的第一个Loopbackjs项目,并面临一个看似简单的问题: 假设我有一个模型“Post”和一个模型“Tag”。邮政拥有并且属于许多标签。LoopbackJS:HasAndBelongsToMany,如何通过关系的属性查询/过滤?

现在我需要列出具有特定标签的所有帖子。我只是无法弄清楚如何用Loopback创建一个查询来实现这一点。 我认为它会这样工作,但它不: Posts.find({where: {tag.id: {inq: [1, 4]}}}); 

我将不胜感激任何帮助。

回答

4

这不像应该对某些相关属性执行过滤器那么简单。 There is a pull request outstanding but it's been open for a long time now.据我所看到的,过滤的唯一方法是在主模式,所以你可以这样做:

Tags.find({"include":"posts","where":{"id":{"inq":[1, 4]}}}) 

不幸的是,你需要做更多的工作,以获得从文章的一个很好的列表你回来的结果。

编辑您也可以得到所有的帖子,只带回符合使用scope您查询的标签,有如下:

Posts.find({ 
    "include": { "relation": "tags", 
        "scope": { 
         "where": { 
          "id": { "inq": [1, 4]} 
         } 
        } 
       } 
}); 

在查询的回调,你可以整理一下结果在返回之前使用以下代码:

var finalresult = instance.filter(function(post) { 
    return post.toJSON().tags.length > 0; 
}); 

好处是,返回的结果格式与您的预期相同。但是,我的第二个示例的性能可能非常差,因为它将始终返回所有帖子,除非您在帖子级别指定过滤器或分页。它基本上是一个左连接,在那里你想要一个内连接,这个Loopback目前无法做到。

+0

非常感谢!我现在这样做,然后过滤出重复项。不过,我认为这是LoopbackJS ORM的一个很大的限制,我正在重新考虑将它用于更大的项目。 – Nanunana

+0

@Nanunana当我发现时,我无法相信......我做了更多的挖掘并找到了另一种方式。仍然不是很好,但也许更好一点。看我的编辑。 – conradj

+0

Hy,我有一个hasOne关系,并且像这样做的工作..但它包括关系字段连同主要对象..是否有可能使它分离?恩。可以说标签有字段标记名..所以它来Post.tagname ..而不是Post.tag.tagname – mariomol

0

我来到这里的同一个问题,但经过一些研究后,我得到了这个解决方案。

我要用一个例子:model Provincias hasAndBelongsToMany Cantones。

为了得到:/ API/Provincias/1/cantones

您可以在角代码中使用:

Provincias.cantones({ 'ID':1});

+0

欢迎来到Stackoverflow。请花些时间阅读如何写出一个好的答案。阅读[this](http://meta.stackexchange.com/a/7659/338114)和[this](http://stackoverflow.com/help/how-to-answer) –