使用 bookshelf.js 过滤关系查询
Filter relation query using bookshelf.js
如何使用 through 方法检索所有记录,但有中间 table 的条件,例如:我想检索专辑中 is_publish 字段的频道的所有曲目(中间table) 的值为 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,name,desc
专辑:channel_id,名称,描述,is_publish
曲目:album_id、名称、描述
有什么建议吗?
我还没有测试过这个,但我相信你可以做到以下几点:
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()
的调用。
如何使用 through 方法检索所有记录,但有中间 table 的条件,例如:我想检索专辑中 is_publish 字段的频道的所有曲目(中间table) 的值为 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,name,desc
专辑:channel_id,名称,描述,is_publish
曲目:album_id、名称、描述
有什么建议吗?
我还没有测试过这个,但我相信你可以做到以下几点:
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()
的调用。