2

との間hasManyに tobelongsTo関係がboxesありbox_statesます。

すべてのボックスを最新の状態で取得したいので、これが私のクエリです。

new Box()
    .orderBy('id', 'ASC')
    .fetchAll({
        withRelated: [{
            'states' :  function(qb) {
                qb.limit(1)
                    .orderBy('id', 'DESC');
            }
        }]
    })
    .then(function (boxes) {
        res.json(boxes);
    });

これはすべてのボックスを返しますが、最後のボックスだけが 1 つのリレーションを持っています。すべては関係ありません。

助けていただければ幸いです。

4

2 に答える 2

3

まあ、これはほとんど期待どおりに機能します。ソリューションをデバッグすると、次のように表示されます (例を示しますが、これはあなたのものと同じ関係 (1 つの町、多くの住所) です)。

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)セグメント)に対して 1 つの(!) 関連モデル ( ) のみを選択することです。

したがって、基本的に行う必要があるのは、主な結果を foreach し、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);
    });

});

より良いオプションがあるかどうかはわかりません...これは機能します。

于 2015-05-20T20:46:53.230 に答える