Sequelize - есть ли двунаправленные ассоциации?

В документации Sequelize ORM http://docs.sequelizejs.com/ я не вижу никаких ссылок на двунаправленные ассоциации между моделями, как мы знаем из Java Hibernate или PHP Doctrine.

Итак, Sequelize не поддерживает двунаправленные ассоциации из коробки?

Вы имеете в виду ассоциации M: N? [Вот] объяснение. Или вы имеете в виду, когда вы устанавливаете hasMany в модели Origin, но также и для доступа из модели Destination? (docs.sequelizejs.com/manual/tutorial/…)

Ellebkey 24.10.2018 19:12

Двунаправленные ассоциации могут быть созданы как один к одному, так и один ко многим. В случае один-к-одному, если у пользователя есть задача, мы можем сделать user.getTask()также как task.getUser(). Его там нет.

Jan Bodnar 24.10.2018 19:25

Хорошо, sequelize не делает этого по умолчанию, вы должны указать на моделях User.hasMany(Task), а затем Task.belongsTo(User). Я рекомендую использовать псевдоним :as на hasMany, а затем после создания базы данных вы используете belongsTo с псевдонимом также и для другой модели. Я знаю, это звучит очень смешно, но это лучший способ сделать это, поскольку я работал с сиквелизами.

Ellebkey 24.10.2018 20:09
Поведение ключевого слова "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) для оценки ваших знаний,...
1
3
863
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это зависит от того, что вы подразумеваете под "из коробки".

Двунаправленные ассоциации в Sequelize достигаются путем определения двух отдельных ассоциаций для каждой соответствующей модели. Насколько я знаю, другого пути нет.

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

User.associate = function(models) {
    models.User.hasMany(models.Post, {
        foreignKey:"UserId"
    })
}

Post.associate = function(models)  {
    models.Post.belongsTo(models.User, {
        foreignKey:"UserId"
    })
}

Подобные подходы подходят для любого типа ассоциации. Я знаю, это кажется не самым удобным.

Это работает, когда я также добавляю belongsTo к hasMany. Так что можно. Я не уверен в синтаксисе foreignKey; это дает мне ошибку.

Jan Bodnar 27.10.2018 20:12

Какую версию сиквелиза вы используете?

slysterous 29.10.2018 02:11

также проверьте этот ссылка на целевых ключах ..

slysterous 29.10.2018 02:29

Версия 4.39.1. Это заканчивается ошибкой SQL. (MySQL). Я ожидал чего-то вроде инверсии, backref в одной из моделей.

Jan Bodnar 29.10.2018 07:35

Я использую 4.38.0, но на диалекте Postgres. Вероятно, это была моя вина, что я написал это, возможно, MySQL не поддерживает целевые ключи. тем не менее, это не имеет большого значения, поскольку ваши идентификаторы внешних ключей устанавливаются по соглашению, что, скорее всего, вам вообще не нужно в целевых ключах. :)

slysterous 29.10.2018 14:55

Вместо hasMany я пытаюсь сделать hasOne, но это, похоже, не работает.

Shamoon 13.09.2019 16:22

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