你如何使用Bookshelf与很多关系查询数据?

时间:2016-09-05 16:28:51

标签: node.js bookshelf.js knex.js

所以,我有以下内容:

var Device = services.bookshelf.Model.extend({
    tableName: 'device',
    calendar: function() {
        return this.belongsToMany(Calendar, 'calendar_device', 'deviceId', 'calendarId');
    }
});

var Calendar = module.exports = services.bookshelf.Model.extend({
    tableName: 'calendar',
    device: function() {
        return this.belongsToMany(Device, 'calendar_device', 'calendarId', 'deviceId');
    },
    schedule: function() {
        return this.hasMany(Schedule);
    }
});

var Schedule = module.exports = services.bookshelf.Model.extend({
    tableName: 'schedule',
    calendar: function() {
        return this.belongsTo(Calendar);
    },
    channel: function() {
        return this.hasMany(Channel);
    }
});

var Channel = module.exports = services.bookshelf.Model.extend({
    tableName: 'channel',
    schedule: function() {
        return this.belongsTo(Schedule);
    },
    screenItem: function() {
        return this.hasMany(ScreenItem);
    }
});

关系继续...... 我应该如何进行查询以获取设备的频道?我不知道我是否遗漏了一些东西,但是我还没有找到关于此的更多信息...

1 个答案:

答案 0 :(得分:3)

Device.where('id', id).fetch({withRelated: ['calendar.schedule.channel']}).then(function(devices) {
    ...
})

我所做的是使用'id'= id获取设备,指定我想要返回的模型的关系(声明为我可以在我的问题中的模型声明中看到)。 所以,说:

  • {withRelated:['calendar']}返回设备及其日历
  • {withRelated:['calendar.schedule']}返回一个设备,其日历及其时间表
  • {withRelated:['calendar.schedule.channel']}返回一个设备及其日历及其时间表及其频道

等等,如果您想要获得更多相关模型。

响应类似于:

{
    id: 1,
    ...,
    calendars: [
        id: 1,
        ...,
        schedules: [
            ...
        ]
    ]
}