gpt4 book ai didi

javascript - 无法与 Sequelize 建立一对一关系

转载 作者:行者123 更新时间:2023-11-29 03:00:47 25 4
gpt4 key购买 nike

我声明:

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)允许你为同一个模型创建多个关联,所以当你只提供模型时,sequelize 无法知道你真正想要哪个模型加载。

我们一直在讨论使用关系调用的返回值的能力,比如:

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])

但现在您必须使用帖子开头提供的代码:)

关于javascript - 无法与 Sequelize 建立一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24066446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com