无法与Sequelizebuild立一对一的关系

我宣称:

Item.hasOne(Item, { foreignKey: 'parentAid', as: 'Parent' }) 

我质疑:

 Item.find({where : {aid: aid}, include: [Item]}).complete(function(err, article) { .. }; 

我得到:

 Error: Item is not associated to Item! 

我究竟做错了什么?

………………………………………….. ……………………………………..

更新1

感谢Jan Aargaard Meier的有益回答,我能够改变:

 ItemModel.belongsTo(ItemModel, { foreignKey: 'parentAid', as: 'Parent', foreignKeyConstraint: true }); ItemModel.hasMany(ItemModel, { as: 'Children', constraints: false }); this.articleRelations.push({ model: ItemModel, as: 'Parent' }); this.articleRelations.push({ model: ItemModel, as: 'Children' }); // ... 

我的查询现在是:

 {where : {aid: aid}, include: this.articleRelations} 

但是我收到以下错误:

 { code : "ER_BAD_FIELD_ERROR", errno : 1054, sqlState : "42S22", index : 0, sql : "SELECT `item`.*, `Parent`.`aid` AS `Parent.aid`, `Parent`.`gid` AS `Parent.gid`, `Parent`.`title` AS `Parent.title`, `Parent`.`type` AS `Parent.type`, `Parent`.`parentAid` AS `Parent.parentAid`, `Parent`.`createdAt` AS `Parent.createdAt`, `Parent`.`updatedAt` AS `Parent.updatedAt`, `Parent`.`itemId` AS `Parent.itemId`, `Parent`.`aid` AS `Parent.aid`, `Parent`.`aid` AS `Parent.aid`, `Parent`.`aid` AS `Parent.aid`, `Children`.`aid` AS `Children.aid`, `Children`.`gid` AS `Children.gid`, `Children`.`title` AS `Children.title`, `Children`.`type` AS `Children.type`, `Children`.`parentAid` AS `Children.parentAid`, `Children`.`createdAt` AS `Children.createdAt`, `Children`.`updatedAt` AS `Children.updatedAt`, `Children`.`itemId` AS `Children.itemId`, `Children`.`aid` AS `Children.aid`, `Children`.`aid` AS `Children.aid`, `Children`.`aid` AS `Children.aid` FROM (SELECT `item`.* FROM `item` WHERE `item`.`aid`=2 LIMIT 1) AS `item` LEFT OUTER JOIN `item` AS `Parent` ON `Parent`.`aid` = `item`.`parentAid` LEFT OUTER JOIN `item` AS `Children` ON `item`.`aid` = `Children`.`itemId`;" 

}

注意:*表名是item *查询包含itemId ,我没有在任何地方定义。 这似乎是一个错误?

作为参考,这是我的模型:

 ItemModel = sequelize.define('ExerciseItem', { aid: {type: Sequelize.INTEGER.UNSIGNED, primaryKey: true, autoIncrement: true}, gid: {type: Sequelize.INTEGER.UNSIGNED}, title: Sequelize.STRING(100), type: Sequelize.INTEGER.UNSIGNED, parentAid: Sequelize.INTEGER.UNSIGNED },{ freezeTableName: true, tableName: 'item' }); 

 Item.find({where : {aid: aid}, include: [{ model: Item, as: 'Parent' }]) 

如果你给这个关系一个别名,你必须在进行预加载的时候提供这个别名(就像你在一个项目实例上调用getParent而不是getItem

这是因为别名(使用as )允许你创build几个关联到同一个模型,所以当你刚刚提供模型时,没有办法用seqelize来知道你真的想要加载哪个模型。

我们一直在谈论使用关系调用的返回值的能力,而不是像下面这样:

 var itemParentRelation = Item.hasOne(Item, { foreignKey: 'parentAid', as: 'Parent' }) Item.find({where : {aid: aid}, include: [itemParentRelation]) // or Item.find({where : {aid: aid}, include: [item.relations.parent]) 

但现在你必须使用在开始提供的代码:)