0

through メソッドを使用してすべてのレコードを取得する方法はありますが、中間テーブルの条件があります。例: アルバム (中間テーブル) の is_publish フィールドの値が 1 であるチャネルのすべてのトラックを取得したい

これまでの私のコードは次のようになります。

new channelModel({'id': req.params.channel_id})
.fetch({withRelated: ['tracks']})
.then(function (channel) {
    if (channel) {
        res.json({error: false, status: 200, data: channel});
    } else {
        res.json({error: true, status: 404, data: 'channel does not exist'});
    }
})

このコードでは、すべてのトラックを取得します。チャネル モデルには、次のように定義された関数があります。

tracks: function () {
    return this.hasMany('track').through('album');
}

私のデータベースは次のようになります。

チャネル: ID、名前、説明

アルバム:channel_id,name,descr,is_publish

トラック:album_id,name,descr

なにか提案を?

4

1 に答える 1

7

私はこれをテストしていませんが、次のことができると思います。

ChannelModel = bookshelf.BaseModel.extend({
    tracks: function () {
        return this.hasMany('track').through('album');
    },
    publishedTracks: function () {
        return this.tracks().query('where', 'is_publish', true);
    },
    unpublishedTracks: function () {
        return this.tracks().query('where', 'is_publish', false);
    },
});

new ChannelModel({'id': req.params.channel_id})
.fetch({withRelated: ['pubishedTracks']})
.then(function (channel) {
    if (channel) {
        res.json({error: false, status: 200, data: channel.toJSON()});
    } else {
        res.json({error: true, status: 404, data: 'channel does not exist'});
    }
});

または、次のようにすることもできます。

new ChannelModel({'id': req.params.channel_id})
.fetch()
.tap(function (channel) {
    channel.tracks().query('where', 'is_publish', true).fetch()
})
.then(function(channel) {
    if (channel) {
        res.json({error: false, status: 200, data: channel.toJSON()});
    } else {
        res.json({error: true, status: 404, data: 'channel does not exist'});
    }
});

require: trueまた、このような状況で私が好むスタイルである を指摘するかもしれません。

new ChannelModel({'id': req.params.channel_id})
.fetch({ require: true })
.tap(function (channel) {
    channel.tracks().query('where', 'is_publish', true).fetch()
})
.then(function(channel) {
    res.json({error: false, status: 200, data: channel.toJSON()});
})
.catch(bookshelf.NotFoundError, function(error) {
    res.json({error: true, status: 404, data: 'channel does not exist'});
});

また、返信で への通話を中断していたことにも注意して.toJSON()ください。

于 2015-02-25T00:13:14.750 に答える