Mysql SequelizeAgerLoadingError:(父项)未与(子项)关联!

Mysql SequelizeAgerLoadingError:(父项)未与(子项)关联!,mysql,node.js,express,sequelize.js,sequelize-cli,Mysql,Node.js,Express,Sequelize.js,Sequelize Cli,我正在使用sequelize构建一个应用程序。我现在有3张桌子;用户、巡演和地点。该地点与旅游有n:1关系。巡更与用户有n:1关系 如果没有用户关联,其他两个表可以正常工作。一旦我添加了用户关联(我已经尝试通过迁移、删除然后重新创建整个数据库来实现这一点),我会得到一个SequelizeAgerLoadingError:Location与Tour不关联 以下是我的模型: module.exports=函数(续集,数据类型){ var Location=sequelize.define(“位置”

我正在使用sequelize构建一个应用程序。我现在有3张桌子;用户、巡演和地点。该地点与旅游有n:1关系。巡更与用户有n:1关系

如果没有用户关联,其他两个表可以正常工作。一旦我添加了用户关联(我已经尝试通过迁移、删除然后重新创建整个数据库来实现这一点),我会得到一个SequelizeAgerLoadingError:Location与Tour不关联

以下是我的模型:

module.exports=函数(续集,数据类型){
var Location=sequelize.define(“位置”{
标题:{
类型:DataTypes.STRING,
allowNull:错误
},
说明:{
类型:DataTypes.TEXT,
allowNull:错,
验证:{
蓝:[500]
}
},
地址:{
类型:DataTypes.TEXT,
allowNull:错误
}
});
Location.associate=功能(模型){
位置。所属位置(型号、行程、{
onDelete:“级联”
});
};
返回位置;

};尝试将其添加到您的关联中,为什么您要在Tour中定义两次关联函数

module.exports = function(sequelize, DataTypes) {
  var Location = sequelize.define("Location", {
    //
  });

  Location.associate = function(models) {
    Location.belongsTo(models.Tour, { as:'Tour', foreignKey:'tourId', onDelete: "cascade"});
  };

  return Location;
};

module.exports = function(sequelize, DataTypes) {
  var Tour = sequelize.define("Tour", {
    //
  });

  Tour.associate = function(models) {
    Tour.hasMany(models.Location, { as: 'Locations', foreignKey: 'tourId'});
    Tour.belongsTo(models.User, { as: 'User', foreignKey: 'userId' });
  };


  return Tour;
};

module.exports = function(sequelize, DataTypes) {
  var User = sequelize.define("User", {
    //
  });

  User.associate = function(models) {
    User.hasMany(models.Tour, {as: 'Tours', foreignKey: 'userId'});
  };

  return User;
};
并将其添加到查询中

db.Tour.findOne({
  where: { id: req.params.id },
  include: [{ 
    model: db.Location,
    as: 'Locations'
  }]
}).then(function(tour) {
  res.render("tour", {
    tour: tour
  });
});

我明白了——事实上,我已经在tours模型上定义了两次关联,这破坏了一切。一旦我像上面提到的那样将它们组合起来,一切都完美地工作了


还有一件事需要注意-sequelize自动分配外键和别名,因此我省略了该部分。

异常发生在哪一行,消息是什么?您的第四个代码块似乎至少从两个位置粘贴在一起。下半部分应该是什么,它如何与应用程序配合。获取定义?现在只是猜测,您可能还需要定义从巡演到位置的反向关系,即巡演有多个位置。“hasMany”,就像你为用户和巡演做的一样。@Christoph-谢谢你!事实上,我确实在巡演模型中建立了hasMany,但我在昨晚的复制/粘贴工作中忽略了这一点。我更新了模型,并对最后一个块做了一些澄清——基本上第一个块(get路由)就是抛出错误的地方,就在“Include:db.Location”行上。第二部分是我们如何确定API路由,第三部分是我们如何根据客户端输入实际构建位置和路线。非常感谢!为了回答你的问题,我这么做是因为我对这一点还是非常陌生的,我甚至没有想到我可以将这两种说法结合起来……但现在它是如此明显!不过我注意到外键和“as”是由sequelize自动分配的。在这种情况下,在模型中显式地调用它会有所不同吗?所以看起来ellebkey找到了解决方案,双重关联。然后请将她的答案标记为正确答案,这是堆栈溢出的习惯。