2015-05-23 2 views
0

Я смущен, как применять BelongsToMany с книжной полкой.BookshelfJS: Как применять BelongsToMany?

Скажите, есть фильм, который принадлежит многим жанрам, например.

"The Artist" has the genres "Comedy, Drama" 

Я установки объединения таблицы называется join_movies_genres, который имеет FK movie_id и genre_id.

Я пытаюсь найти жанры из фильма с определением through(...) и без него. Я получаю, однако, неопределенные цели, похожие на:

relatedData: 
{ type: 'belongsToMany', 
    target: 
    { [Function] 
    NotFoundError: [Function: ErrorCtor], 
    NoRowsUpdatedError: [Function: ErrorCtor], 
    NoRowsDeletedError: [Function: ErrorCtor] }, 
targetTableName: 'genres', 
targetIdAttribute: 'id', 
joinTableName: 'join_movies_genres', 
foreignKey: { debug: true }, 
otherKey: undefined, 
parentId: 1, 
parentTableName: 'movies', 
parentIdAttribute: 'id', 
parentFk: 1, 
throughTarget: 
    { [Function] 
    NotFoundError: [Function: ErrorCtor], 
    NoRowsUpdatedError: [Function: ErrorCtor], 
    NoRowsDeletedError: [Function: ErrorCtor] }, 
throughTableName: 'join_movies_genres', 
throughIdAttribute: 'id', 
throughForeignKey: { debug: true } } 

Итак, как бы я подошел к настройке этого отношения? Как включить вывод отладки?

Текущее состояние модели является:

 
var Movie = bookshelf.Model.extend({ 
    tableName: 'movies', 

    genres: function() { 
     // return this.belongsToMany(Genre, 'join_movies_genres', 'movie_id', 'genre_id', {debug: true}); 
     // return this.belongsToMany(Genre).through(JoinMovieGenre, 'movie_id', 'genre_id'); 
     return this.belongsToMany(Genre, 'join_movies_genres', 'movie_id', 'genre_id').through(JoinMovieGenre, {debug: true}); 
    } 
}); 

var Genre = bookshelf.Model.extend({ 
    tableName: 'genres' 
}); 

new Movie({title: 'The Artist'}).fetch({debug: true}).then(function(m) { 
    console.log(m.toJSON()); 
    console.log(m.genres()) 
}) 

песочница этого кода в https://github.com/mulderp/bookshelf-demo/tree/cli_migrations

+0

Обновление: Есть несколько вещей, которые я только что узнал. Соглашения об именах упрощают извлечение отношений, а выборка позволяет настраивать запрос с параметрами: fetch ({withRelated: ['genres'], require: true, debug: true}). - все еще нужно изучить эту проблему немного больше – poseid

ответ

3

делает эту работу?

var Movie = bookshelf.Model.extend({ 
    tableName: 'movies', 

    genres: function() { 
     return this.belongsToMany(Genre, 'join_movies_genres', 'movie_id', 'genre_id'); 
    } 
}); 

var Genre = bookshelf.Model.extend({ 
    tableName: 'genres' 
}); 

new Movie({title: 'The Artist'}).fetch({withRelated:['genres']}).then(function(m) { 
    console.log(m.toJSON()); 
}); 
+0

да! Спасибо за это! – poseid

+0

Я написал сообщение в блоге о некоторых экспериментах по этому поводу: http://thinkingonthinking.com/relations-with-bookshelfjs/ - был удивлен, что приложение(), которое прекрасно работает на многих-ко-многим, для многих ... почему :)? – poseid

+1

Это просто: 'attach' - это эксклюзивный метод« многие-ко-многим ». На официальной странице: «* Прикрепляет одну или несколько идентификаторов от внешней таблицы к текущей таблице, в отношениях, принадлежащих toMany. *« – uglycode

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