1

BelongsToMany を Bookshelf に適用する方法がわかりません。

たとえば、BelongsToMany Genres の映画があるとします。

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

join_movies_genresFKmovie_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())
})

A sandbox of this code is at https://github.com/mulderp/bookshelf-demo/tree/cli_migrations

4

1 に答える 1

5

これは機能しますか?

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());
});
于 2015-05-23T14:14:13.503 に答える