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

#node.js #express #sequelize.js

#node.js #выразить #sequelize.js

Вопрос:

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


Model1: cities

Model2: districts
this.belongsTo(models.cities, {as: "city", foreignKey: 'city_id'});

Model3: streets
this.belongsTo(models.districts, {as: "district", foreignKey: 'district_id'});

Model4: houses
this.belongsTo(models.streets, {as: "street", foreignKey: 'street_id'});

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

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

Ответ №1:

Вам нужно будет пройти весь путь dowm от 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
      }]
    }]
  }]
});
  

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