2015-11-10 4 views
3

Bookshelf.js документация есть примеры кода с "новой" и без "нового":В чем разница в использовании «новых» при извлечении моделей Bookshelf.js?

Здесь http://bookshelfjs.org/#Model-instance-hasMany

let Author = bookshelf.Model.extend({ 
    tableName: 'authors', 
    books: function() { 
    return this.hasMany(Book); 
    } 
}); 

// select * from `authors` where id = 1 
// select * from `books` where author_id = 1 
Author.where({id: 1}).fetch({withRelated: ['books']}).then(function(author) { 
    console.log(JSON.stringify(author.related('books'))); 
}); 

Но здесь http://bookshelfjs.org/#Model-instance-fetch

let Book = bookshelf.Model.extend({ 
    tableName: 'books', 
    editions: function() { 
    return this.hasMany(Edition); 
    }, 
    chapters: function{ 
    return this.hasMany(Chapter); 
    }, 
    genre: function() { 
    return this.belongsTo(Genre); 
    } 
}) 

new Book({'ISBN-13': '9780440180296'}).fetch({ 
    withRelated: [ 
    'genre', 'editions', 
    { chapters: function(query) { query.orderBy('chapter_number'); }} 
    ] 
}).then(function(book) { 
    console.log(book.related('genre').toJSON()); 
    console.log(book.related('editions').toJSON()); 
    console.log(book.toJSON()); 
}); 

Так в чем разница?

+0

Обратите внимание, что в первом примере используется 'X.where()'. Дело не только в том, что 'new' не используется, используется другой метод получения экземпляра. Я думаю, если вы прочитаете о том, что делает «.where», вы поймете разницу (знаете ли вы, что «новый X()» делает в JavaScript?) –

ответ

5

Без разницы.

Model.fetch, Model.query, Model.where и Model.fetchAll являются сокращение для:

Model[method] = function(...args) { 
    return Model.forge()[method](...args); 
} 

Model.forge И является обобщающим для new.

Model.forge = function(...args) { 
    return new this.constructor(...args); 
}