Как сделать запрос продолжения, который также возвращает данные из таблицы, связанной с моей таблицей соединений?

Это не мои конкретные таблицы, но я пытаюсь добиться того же, поэтому не слишком увлекайтесь базовым примером библиотеки / книги.

Допустим, у меня есть несколько таблиц / моделей:

  1. books

    • book_id (число, pk)
    • имя (varchar)
  2. users

    • user_id (число; pk)
    • имя (varchar)
  3. bookusers (соединительный стол)

    • bookusers_id (int, pk, наверное, не обязательно, но ничего не вредит)
    • users_id (fk в таблицу пользователей)
    • books_id (от fk до таблицы с книгами)
    • library_id (от fk до таблицы библиотек)
  4. libraries

    • library_id (число, pk)
    • имя (varchar)

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.10
  • БД: sqlite3
  • Nodejs: 8.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
});

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

feiiiiii 19.06.2018 17:42

Я никогда не могу понять, когда использовать ownTo или has Many

kauffee000 20.06.2018 12:59
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
235
0

Другие вопросы по теме