Как построить отношения bookshelf.js после определения модели?

Я определил модель Книжной полки как

var Country =  Bookshelf.Model.extend({
    tableName: 'countries',
});

var Address =  Bookshelf.Model.extend({
    tableName: 'addresses',
    country: function() {
        return this.belongsTo(Country,'country_id');
    },
});

Теперь я могу получить одну из моих моделей из базы данных

new Country({name:"Italy"}).fetch()
.then(function(country){

И создать и адрес

    new Address({...}).save().then(function(address){

Но я не могу найти в документации, какой метод помог бы мне построить отношение "принадлежат". без ручной установки атрибута country_id на правильный.

Единственное, что я вижу для построения отношений, - это метод collection.create(object) ( http://bookshelfjs.org/), который описывается как удобство для создания модели из объекта, ее сохранения и добавив его в коллекцию; Я бы тоже не знал, как сделать последнюю часть.

В любом случае, collection.create, по-видимому, не доступен для model.related('collectionName'), когда collectionName ссылается на отношения hasOne или ownTo, поскольку они не представляют коллекции.

1 ответ

С тем, как вы делаете это, вам нужно будет сделать это вручную. Вы должны использовать обратное отношение как это:

var Country =  Bookshelf.Model.extend({
    tableName: 'countries',
    addresses: function() {
       return this.hasMany(Address);
    }
});

var Address =  Bookshelf.Model.extend({
    tableName: 'addresses',
    country: function() {
        return this.belongsTo(Country,'country_id');
    },
});

Тогда вы должны быть в состоянии сделать:

new Country({name: Italy}).fetch().then(function(italy) {

   // also could be italy.related('addresses'), that would add
   // the addresses collection to the "italy" model's "relations" hash
   return italy.addresses().create({...});

}).then(function(address) {

   // ... saved to the db with the correct address

});
Другие вопросы по тегам