#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
}]
}]
}]
});
Теперь, другим способом может быть, как вы упомянули, который устанавливает связь непосредственно из городов в дома, но это действительно зависит от вашей схемы и бизнес-модели.