[英]Unable to establish one-to-one relation with Sequelize
我宣布:
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
)使您可以创建与同一模型的多个关联,因此,当您仅提供模型时,就没有办法让续集知道您实际要加载的模型。
我们一直在谈论使用关系调用的返回值的能力,例如:
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])
但是现在您必须使用帖子开头提供的代码:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.