Это не мои конкретные таблицы, но я пытаюсь добиться того же, поэтому не слишком увлекайтесь базовым примером библиотеки / книги.
Допустим, у меня есть несколько таблиц / моделей:
books
users
bookusers (соединительный стол)
libraries
Books и Users имеют отношение m: n. Книгу могут проверить многие пользователи, а пользователи могут просмотреть множество книг. Таблица bookusers - это таблица соединений между ними, в которой хранится, что на самом деле было выдано и кому. Кроме того, я сохраняю идентификатор библиотеки, из которой она была извлечена, который является внешним ключом для таблицы libraries.
С учетом сказанного, вот чего я не могу понять. Я хочу сделать запрос в своем приложении узла с помощью Sequelize, который возвращает все книги, извлеченные конкретным человеком, включая информацию библиотеки, из которой они были извлечены.
Вот что у меня есть на данный момент:
2.User -> Модель секвелизации для таблицы пользователейBook -> Модель Sequelize для книгBookUsers -> Модель Sequelize для пользователей книгLibrary -> Модель секвелизации для библиотекКод:
User.findOne({
where: { id: 2 },
include: [{ model: Book }],
}).then((user) => {
console.info(user);
}).catch((err) => {
// handle error
});
Это регистрирует что-то вроде:
{
"user_id": 2,
"name": "Jane Doe",
"Books": [
{
"book_id": 1,
"name": "Moby Dick",
"BookUser": {
"bookusers_id": 1,
"user_id": 2,
"book_id": 1,
"library_id": 1
}
}
]
}
Это работает так, как я ожидал. Он возвращает пользователя со всеми книгами, которые он в данный момент просмотрел. Я также хочу и не могу понять, как я могу получить информацию о библиотеке в этом запросе.
Что-то вроде этого:
User.findOne({
where: { id: 2 },
through: { include: [{ model: ToolType }]}, // not valid
include: [{ model: Book }]
}).then((user) => {
console.info(user);
}).catch((err) => {
// handle error
});
Ответ:
{
"user_id": 2,
"name": "Jane Doe",
"Books": [
{
"book_id": 1,
"name": "Moby Dick",
"BookUser": {
"bookusers_id": 1,
"user_id": 2,
"book_id": 1,
"library_id": 1,
"Library": {
"library_id": 1,
"name": "Carnegie Library"
}
}
}
]
}
Вот мои текущие ассоциации между таблицами:
User.belongsToMany(Book, { through: { model: 'BookUsers' }});
Book.belongsToMany(User, { through: { model: 'User' }});
BookUsers.hasMany(Library, { through: { model: 'Library' }});
Первые две ассоциации работают нормально для включения списка книг с пользователем. BookUsers, я понятия не имею, правильно ли это и что должно быть.
Любая помощь будет принята с благодарностью! Или свяжите меня с другими вопросами, в которых на это есть ответ. Я не мог их найти!
Заметки:
4.37.10sqlite38.11.1Я нашел решение, используя async / await. Он грязный и не использует sequelize, но я буду использовать его, пока что-нибудь не выясню.
User.findOne({
where: { id: 2 },
include: [{ model: Book }]
}).then((user) => {
user.Books.map((book) => book.dataValues);
(async() => {
for (let i=0;i<user.Books.length;i++) {
user.Books[i].dataValues.library = await Library.findById(user.Books[i].BookUsers.library_id);
}
console.info(user);
})();
}).catch((err) => {
// handle error
});
Я никогда не могу понять, когда использовать ownTo или has Many



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


я думаю это должен быть
Library.belongsTo(Book, { through: { model: 'BookUsers' }});