简体   繁体   English

无法与Sequelize建立一对一关系

[英]Unable to establish one-to-one relation with Sequelize

I declared: 我宣布:

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

I queried: 我询问:

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

And I get: 我得到:

Error: Item is not associated to Item!

What am I doing wrong? 我究竟做错了什么?

.............................................................................................. .................................................. ............................................

UPDATE 1 更新1

Thanks to the helpful answer by Jan Aargaard Meier , I was able to change things to: 感谢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'
});

// ...

My query is now: 我的查询现在是:

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

But I am getting the following error: 但是我收到以下错误:

{
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`;"

} }

Note: * The table name is item * The query contains itemId , which I did not define anywhere. 注意:*表名是item *查询包含itemId ,我在任何地方都没有定义。 That seems to be a bug? 那似乎是个错误?

For reference, this is my model: 供参考,这是我的模型:

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

If you give the relation an alias, you have to provide that alias when doing eager loading (just like you would call getParent instead of getItem on an item instance) 如果为关系提供别名,则在进行急切加载时必须提供该别名(就像在项目实例上调用getParent而不是getItem

This is because aliasing (using as ) allows you to create several associations to the same model, so when you just provide the model there is no way for sequelize to know which model you actually want to load. 这是因为别名(使用as )使您可以创建与同一模型的多个关联,因此,当您仅提供模型时,就没有办法让续集知道您实际要加载的模型。

We have been talking about the ability to using the return value from the relation call instead, something like: 我们一直在谈论使用关系调用的返回值的能力,例如:

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

But for now you'll have to use the code provided in the beginning of the post :) 但是现在您必须使用帖子开头提供的代码:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM