如何使用withRelated bookshelf

时间:2016-05-08 05:56:52

标签: bookshelf.js

例如,我有2个表,如;

table1 {Id, Name, Description}
table2 {Id, Table1Id, Name, Amount}

当我使用withRelated之类的东西时使用bookshelfJS;

new table1({Id: 1})
.fetchAll({
    withRelated: ['Childs']})
.then(function(rows) {
    callback(null, rows);
});

我期待我的结果像;

{results: [{Id: '', Name: '', Description: '', Childs: [{Id: '', Name: '', Amount: 123}]}]}

我不想在Childs列表中获得 Table1Id 。如何指定输出中的哪些列?

更新
我的模特;

table1 = bookshelf.Model.extend({
         tableName: 'table1',

         Childs: function() {
            return this.hasMany(table2, 'Table1Id');
         }
});

table2 = bookshelf.Model.extend({
         tableName: 'table2',

         Parent: function() {
            return this.belongsTo(Table1);
         }
});

如果我没有选择Table1Id

new table1({Id: 1})
 .fetchAll({
withRelated: ['Childs':function(qb) {
   qb.select('Id', 'Name', 'Description');
}]})
.then(function(rows) {
      callback(null, rows);
});

然后为Childs []返回空 应该是;

new table1({Id: 1})
 .fetchAll({
withRelated: ['Childs':function(qb) {
   qb.select('Id', 'Table1Id', 'Name', 'Description');
}]})
.then(function(rows) {
      callback(null, rows);
});

2 个答案:

答案 0 :(得分:2)

事情就是这样:这可以很容易地解决,但你需要选择有问题的表的主要ID,否则Bookshelf不知道如何将数据绑定在一起。我们的想法是从Knex.js获取查询构建器并使用select方法(http://knexjs.org/#Builder-select)。

以下是您案件的解决方案:

    new table1({
        Id: 1
    })
    .fetchAll({
        withRelated: [{
            'Childs': function(qb) {
                //always select the primary Id of the table, otherwise there will be no relations between the tables
                qb.select('Id', 'Name', 'Amount'); //Table1Id is omitted!
            }
        }]
    })
    .then(function(rows) {
        callback(null, rows);
    });

如果这可以解决您的问题,请告诉我。

答案 1 :(得分:0)

在bookshelf.js文件中,添加可见性插件,如下所示

bookshelf.plugin('visibility');
在table2模型中

,隐藏不需要的字段,如下所示

table2 = bookshelf.Model.extend({
         tableName: 'table2',
         hidden: ['Table1Id'],

         Parent: function() {
            return this.belongsTo(Table1);
         }
});

您可以从此处了解有关可见性插件的更多信息 https://github.com/tgriesser/bookshelf/wiki/Plugin:-Visibility