Настройка связи многие-ко-многим-сквозным между моделями с использованием таблицы соединений / сквозных соединений.

Это шестая часть серии статей о ExpressJS.

Вы можете найти Часть 1 здесь. В нем рассказывается о создании базового экспресс-API и настройке mocha для тестирования.

Вы можете найти Часть 2 здесь. В нем рассказывается о настройке PostgreSQL, sequelize для подключения экспресс-API к базам данных.

Вы можете найти Часть 3 здесь. В нем говорится о создании ассоциаций (как много, так и принадлежащих) между двумя моделями.

Вы можете найти Часть 4 здесь. В нем говорится о настройке аутентификации пользователя на основе электронной почты и пароля.

Вы можете найти Часть 5 здесь. В нем говорится об использовании веб-токена json для защиты маршрута.

В этой части серии мы возьмем модели User и Post, которые уже связаны через «Автор», и добавим еще одну связь, которая будет «Сохранена».

Один пользователь может иметь много сохраненных сообщений, и одно сообщение может быть сохранено многими пользователями.

Затем мы настроим соответствующие маршруты для проверки ожидаемого ответа.

  • В конкретном сообщении должно быть указано, кто является его автором, а также кто его сохранил. Это не будет защищенный маршрут.
  • У конкретного пользователя должны быть сообщения как автора, так и сохраненные сообщения. Это будет защищенный маршрут.

Давайте сначала займемся тестами -

Фабрики обновлений

Итак, мы настроили это двумя способами

  • post.addSavedBy(reader) и
  • reader.addSaved(post)

Это просто для демонстрации функций, предлагаемых sequelize на наших моделях.

Добавить конкретный пост-тест -

Теперь весь тест выглядит так -

Обновите наш тест JWT -

Поэтому мы проверяем как Written сообщений, так и Saved сообщений, связанных с нашим автором.

Итак, наши тесты готовы, пора писать код.

Добавить сквозную таблицу через миграцию

Мы создадим новую таблицу в нашей базе данных, в которой будет храниться только ассоциативная информация о том, какой пользователь какое сообщение сохранил.

Каждая строка в нашей сквозной таблице представляет собой действие сохранения - один пользователь сохранил одно сообщение.

Итак, если нам нужно найти все сохраненные сообщения для пользователя или для сообщения, которое его сохранило - мы будем (или, скорее, продолжим) использовать эту таблицу.

Это называется «Соединение или Сквозной стол».

Нам нужно создать миграцию, чтобы добавить таблицу в нашу базу данных.

migration:generate и migration:create - это псевдонимы, которые достигают одной и той же цели - создания файла миграции.

Обновите файл миграции -

Поэтому мы называем это сквозной таблицей как SavedPosts.

Пора использовать его для связывания наших моделей User и Post.

Добавить ассоциацию в моделях

Добавить в модель пользователя -

User.belongsToMany(models.Post, { through: ‘SavedPosts’, as: ‘Saved’ })

Добавить в публикацию модель -

Post.belongsToMany(models.User, { through: ‘SavedPosts’, as: ‘savedBy’ })

Здесь мы называем ассоциацию Saved и SavedBy в зависимости от модели. Имеет более семантический смысл сказать

  • Пользователь сохранил сообщение

а также

  • Сообщение было сохранено пользователем.

Запускаем миграцию -

sequelize db:migrate как вы уже хорошо знаете.

Теперь мы успешно построили нашу сквозную таблицу, добавили связь для обеих моделей и соответственно обновили таблицы базы данных.

Пришло время подключиться к нашему потоку запросов / ответов с помощью маршрутов и контроллеров.

Добавить маршрут -

Мы переходим к routes/posts.js и добавляем маршрут для конкретной публикации.

router.get(‘/:id’, postsController.getSpecificPost)

Этот маршрут обрабатывает запрос на следующий URL - например, https:<host>/posts/id. https://articleWebsite.com/posts/7. 7 - это идентификатор сообщения, который обрабатывается как параметр ИЛИ param в нашем API.

Добавить метод в контроллер -

Добавьте метод getSpecificPost в наш контроллер сообщений -

getSpecificPost будет искать сообщение с совпадающим идентификатором и возвращать его в качестве ответа.

Обновить пользовательский контроллер -

Мы также обновим пользовательский контроллер, чтобы прикреплять сохраненные сообщения всякий раз, когда мы запрашиваем пользователя.

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

Теперь тесты должны стать зелеными, и это действительно так.

В следующей части серии мы поговорим о рефакторинге нашего API путем выделения методов запроса к базе данных в отдельные файлы и создания API RESTful.

Мы также добавим модульные тесты для наших моделей и контроллеров.

Craft Academy - это провайдер технического образования, целью которого является вывод на рынок новых талантов и помощь в решении нехватки технических работников. Мы основаны на убеждении, что современные стандарты разработки, гибкие методологии и бизнес-навыки имеют фундаментальное значение для ИТ-специалистов.

Наша основная услуга - это 12-недельный учебный курс по программированию, предназначенный для приобретения людьми основы навыков, которые позволят им войти в отрасль в качестве младших разработчиков.

Благодаря этому наши учащиеся находят работу в различных отраслях или открывают собственное дело, которое выводит на рынок новые инновации.

Хотите узнать больше о том, чем мы занимаемся? Подпишитесь на нас в Medium, Facebook, Twitter или посетите наш сайт.