2016-10-06 2 views
0

У меня есть следующие таблицы:Как связать 3 таблицы вместе в Bookshelf.js

  • books
  • book_reviews
  • users

Здесь находятся модели, которые соответствуют указанному таблицы:

const BookReview = require('./BookReview').model; 
const User = require('./User').model; 

module.exports.model = bookshelf.Model.extend({ 
    tableName: 'books', 

    user: function() { 
    return this.hasOne(User, 'user_id'); 
    }, 

    reviews: function() { 
    return this.hasMany(BookReview); 
    } 
}); 

module.exports.model = bookshelf.Model.extend({ 
    tableName: 'book_reviews', 

    user: function() { 
    this.hasMany(User, 'user_id'); 
    } 
}); 

module.exports.model = bookshelf.Model.extend({ 
    tableName: 'users', 

    reviews: function() { 
    return this.belongsToMany(BookReview, 'user_id'); 
    } 
}); 

Я ищу книгу и пытаюсь извлечь все отзывы, которые он имеет, что в настоящее время он делает со следующим утверждением:

return Book.forge({ 
    id: req.params.id, 
    type: req.params.type 
    }).fetch({withRelated: ['reviews'], require: true}).then(function(book) { 
    console.log(book.toJSON()); 
    return book; 
    }).catch(function(err) { 
    throw new Error(err.message); 
    }); 

};

И выход из book.toJSON() сверху выглядит следующим образом:

Выход из book.toJSON() сверху:

{ id: 1, 
    type: 'novel', 
    slug: 'catcher-in-the-rye', 
    user_id: 1, 
    name: 'Catcher in the Rye', 
    created_at: Tue Oct 04 2016 22:35:42 GMT-0700 (PDT), 
    updated_at: Tue Oct 04 2016 22:35:42 GMT-0700 (PDT), 
    reviews: 
    [ { id: 14, 
     user_id: 2, 
     book_id: 1, 
     rating: 3, 
     review: 'Test', 
     created_at: Wed Oct 05 2016 20:47:34 GMT-0700 (PDT), 
     updated_at: Wed Oct 05 2016 20:47:34 GMT-0700 (PDT) } ] } 

Но мое намерение состоит в том, что каждый из reviews будет иметь ссылку на users, которых в настоящее время нет. Как я могу связать их вместе?

ответ

0

Что делать, если вы:

return Book.forge({ 
    id: req.params.id, 
    type: req.params.type 
    }).fetch({withRelated: ['reviews', 'reviews.user'], require: true}).then(function(book) { 
    console.log(book.toJSON()); 
    return book; 
    }).catch(function(err) { 
    throw new Error(err.message); 
    }); 

?

+0

Я получаю следующее: 'Unhandled rejection Error: допустимая целевая модель должна быть определена для book_reviews hasMany relation' –

+0

Я думаю, что в вашей модели CustomerReview' user' вам нужно поставить идентификатор обзора, а не идентификатор пользователя: например 'this.hasMany (User, 'review_id')'. Помимо этого я не вижу ничего плохого. – blah238

+1

Хорошо, так что на самом деле получается, что у меня была круговая зависимость. Я изменил его так, что это: 'module.exports.model = bookshelf.Model.extend ({ tableName: 'book_reviews', user: function() { const Пользователь = require ('./ User'). Model ; return this.belongsTo (User, 'user_id'); } 'и это сработало! Спасибо! –

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