在FetchAll中限制withhelated的BookshelfJS不起作用

时间:2015-05-08 19:04:14

标签: node.js backbone.js bookshelf.js

我在belongsToboxes之间有box_statesnew Box() .orderBy('id', 'ASC') .fetchAll({ withRelated: [{ 'states' : function(qb) { qb.limit(1) .orderBy('id', 'DESC'); } }] }) .then(function (boxes) { res.json(boxes); }); 的关系。

我想抓住他们最新状态的所有盒子,所以这是我的问题:

.container {
    width: 50%;
    border: 1px solid black;
    text-align: center;
    display: inline-block;
    position: relative;
}

这将返回所有框,但只有最后一个框有一个关系;一切都没有关系。

帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

嗯,这很有效。如果你调试你的解决方案,你会看到这样的事情(我给你的例子,它与你的例子有关 - 一个城镇,很多地址):

select "addresses".* from "addresses" where "addresses"."town_id" in (1, 2, 3, 4) group by "id" limit 1

这样做基本上只为所有实例(address段)选择一个(!)相关模型(addresses.town_id in (1,2,3,4))。

所以基本上你需要做的是预测主要结果并在每个结果上withRelated

new Town().fetchAll().then(function(towns) {

    var my_towns_with_only_last_address = [];

    Promise.map(towns.toJSON(), function(town) {
        return new Town({
            id: town.id
        }).fetch({
            withRelated: [{
                'address': function(qb) {
                    qb.limit(1);
                    qb.orderBy('id', 'desc');
                }
            }]
        }).then(function(result) {
            return my_towns_with_only_last_address.push(result.toJSON());               
        });
    }).then(function() {
        res.json(my_towns_with_only_last_address);
    });

});

我不确定是否有更好的选择......这很有效。

答案 1 :(得分:0)

现在最好的方法(Bookshelf的最新版本)是使用Collection。虽然withRelated中没有.fetchAll(),但在集合上使用.fetch()时可以使用 id <- c(1,1,2,2,2,2,2,3,3,4,4,5,5,5) dist <- c(0,1,1,0,2,15,0,4,4,0,5,5,16,2) data <- data.frame(id, dist ) 。见http://bookshelfjs.org/#Collection-instance-fetch