我在将findAll()方法与Sequelize中的关联一起使用时遇到问题。
我有两个模型:Posts and Authors(一个作者有很多帖子,一个帖子有一个作者),这是我用Sequelize-cli创建的,然后通过迁移命令handleClick(e, activeItem) {
e.preventDefault();
// ... rest of function
}
在mysql中创建的。为了使事情井井有条,在所有迁移模型都存在之后,我在另一个迁移文件中创建了模型之间的关联(使用npx sequelize db migrate:all
创建),因此我的代码如下:
作者模型
npx sequelize init:migrations
POST模型
'use strict';
module.exports = (sequelize, DataTypes) => {
const Author = sequelize.define('Author', {
authorName: {
type: DataTypes.STRING,
validate: {
is: ["^[a-z]+$",'i'],
}
},
biography: {
type: DataTypes.TEXT,
validate: {
notEmpty: true,
}
}
}, {});
Author.associate = function(models) {
Author.hasMany(models.Post);
};
return Author;
};
关联文件(迁移)(仅显示重要的部分)
'use strict';
module.exports = (sequelize, DataTypes) => {
const Post = sequelize.define('Post', {
title: {
type: DataTypes.STRING,
validate: {
is: ["^[a-z]+$",'i'],
notEmpty: true,
},
},
content: {
type: DataTypes.TEXT,
validate: {
notEmpty: true,
},
},
likes: {
type: DataTypes.INTEGER,
defaultValue: 0,
validate: {
isInt: true,
},
},
}, {});
Post.associate = function(models) {
// associations can be defined here
};
return Post;
};
这显然工作得很好,因为在Mysql-Workbench中它显示了以下内容:
但是,当我尝试像这样使用findAll()时:
up: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction(t => {
return Promise.all([
queryInterface.addColumn('Posts','AuthorId', {
type: Sequelize.INTEGER,
references: {
model: 'Authors',
key: 'id',
},
onUpdate: 'CASCADE',
onDelete: 'SET NULL',
}, { transaction: t }),
queryInterface.addColumn('Posts', 'ImagesId', {
type: Sequelize.INTEGER,
references: {
model: 'Images',
key: 'id',
},
onUpdate: 'CASCADE',
onDelete: 'SET NULL',
}, { transaction: t }),
queryInterface.addColumn('Posts', 'CategoryId', {
type: Sequelize.INTEGER,
references: {
model: 'Categories',
key: 'id',
},
onUpdate: 'CASCADE',
onDelete: 'SET NULL',
}, { transaction: t }),
]);
});
它给了我以下error:
SequelizeEagerLoadingError:作者与邮政无关!
所以,我不再知道如何进行。我一直在尝试许多其他方法,但所有方法均未成功。我已经在StackOverFlow上阅读了许多其他有关如何解决此类问题的问题,但这些问题也未成功。
谢谢。
答案 0 :(得分:1)
在查询Post模型时,还需要为Post定义关联
Post.associate = function(models) {
Post.belongsTo((models.Author);
};
您需要从两端添加一个关联,Post -> Author
和Author -> Post
,这样您就永远不会陷入这种错误。