如何在Sequelize中将findAll与关联一起使用

时间:2019-08-27 19:26:41

标签: mysql node.js sequelize.js sequelize-cli

我在将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中它显示了以下内容:forget about the images and categories

但是,当我尝试像这样使用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上阅读了许多其他有关如何解决此类问题的问题,但这些问题也未成功。

谢谢。

1 个答案:

答案 0 :(得分:1)

在查询Post模型时,还需要为Post定义关联

Post.associate = function(models) {
  Post.belongsTo((models.Author);
};

您需要从两端添加一个关联,Post -> AuthorAuthor -> Post,这样您就永远不会陷入这种错误。