Как установить связь между двумя таблицами, которые не зависят напрямую друг от друга с помощью Sequelize? - PullRequest
0 голосов
/ 04 апреля 2019

Я определил эти модели с Sequelize.js v3:

Model1: cities</p> <p>Model2: districts this.belongsTo(models.cities, {as: "city", foreignKey: 'city_id'});</p> <p>Model3: streets this.belongsTo(models.districts, {as: "district", foreignKey: 'district_id'});</p> <p>Model4: houses this.belongsTo(models.streets, {as: "street", foreignKey: 'street_id'});

Есть ли способ установить связь между моделями "города" и "дома", чтобы при выборе города выбирались только дома этого города? Или мне нужно добавить столбец "city_id" в таблицах "районы" и "улицы"?

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

1 Ответ

0 голосов
/ 04 апреля 2019

Вам нужно пройти весь путь от cities до houses. И для этого вам действительно нужно создать ассоциацию сверху вниз, прямо сейчас у вас есть обратная связь. Позвольте мне объяснить.

С вашими фактическими ассоциациями ваши модели называют друг друга следующим образом:

houses -> streets -> districts -> cities

Потому что houses зависит от streets и так далее. Все, что нам нужно, - это перейти к другому.

cities -> districts -> streets -> houses

Model1: cities
this.hasMany(models.districts, {as: "districts", foreignKey: 'city_id'});

И сделать то же самое для districts и streets.

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

cities.findAll({
  include: [{ 
    model: model.districts, 
    as: 'districts', 
    include: [{
      model: model.streets, 
      as: 'streets',
      include: [{
        model: model.houses, 
        as: 'houses',
        where: {} //your condition here
      }]
    }]
  }]
});

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

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