2016-05-08 3 views
0

например, я получил 2 таблицы;Как получить конкретные столбцы из таблицы объединений, используя withRelated bookshelf

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

С книжной полкой, когда я использую withRelated что-то типа;

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

Я ожидал, что мой результат что-то понравится;

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

Я не хочу, чтобы получить 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); 
}); 

затем возвращаются пустыми Чайлдс [].
Должно быть;

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

ответ

2

хорошо вот вещь: это может быть решена довольно легко, но вам нужно выбрать основной идентификатор таблицы в вопросе, иначе Книжная полка не будет знать, как связать данные вместе. Идея заключается в том, что вы получаете построитель запросов из 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); 
    }); 

Позвольте мне знать, если это решит вашу проблему.

+0

Это не работает, если я не выбрал родительский идентификатор: Спасибо. –

+0

Можете ли вы обновить свой вопрос с новым запросом, чтобы я мог видеть, что вы пробовали? – uglycode

1

в файле 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

Смежные вопросы