例如,我有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);
});
答案 0 :(得分:2)
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