【问题标题】:SequelizeEagerLoadingError, can't get data with includeSequelizeEagerLoadingError,无法通过包含获取数据
【发布时间】:2018-10-15 20:22:23
【问题描述】:

我使用 Sequelize.js 向数据库发出请求。我在两个表之间有一个多对多的关系,我制作了第三个连接表。这是我的三张桌子。 polit_in_article 是联结表。

politician.js:

module.exports = (sequelize, DataTypes) => {
    const Politician = sequelize.define('politician', {
        ...
    });

    Politician.associate = (models) => {
        Politician.hasMany(models.Polit_in_article, {
            foreignKey: 'politicianId',
            as: 'polit_in_articles',
        });
    };

    return Politician;
};

article.js:

module.exports = (sequelize, DataTypes) => {
    const Article = sequelize.define('article', {
        ...
    });

    Article.associate = (models) => {
        Article.hasMany(models.Politician, {
            foreignKey: 'articleId',
            as: 'polit_in_articles'
        });
    };
    return Article;
};

polit_in_article.js:

module.exports = (sequelize, DataTypes) => {
    const Polit_in_article = sequelize.define('polit_in_article', {
        times_mentioned: DataTypes.INTEGER,
    });
    Polit_in_article.associate = (models) => {
        Polit_in_article.belongsTo(models.Article, {
            // foreignKey: 'articleId',
            as: 'articles',
        });
        Polit_in_article.belongsTo(models.Politician, {
            // foreignKey: 'politicianId',
            as: 'politicians',
        });
    };

    return Polit_in_article;
};

这是我的控制器(不确定这是否是正确的调用方式):

const Sequelize = require('sequelize');

const Article = require('../models').Article;
const Politician = require('../models').Politician;
const Polit_in_article = require('../models').Polit_in_article;

const Op = Sequelize.Op;

module.exports = {
    getAllArticlesOfPolitician(req) {
        return Article
            .findAll({
                include: [{
                    model: Polit_in_article,
                    include: [{
                        model: Politician,
                        where: {
                            lastname: req.query.politicianLastName,
                        }
                    }],
                }],
            }).then(response => response)
            // .catch(err => err);
    }
};

我得到一个错误SequelizeEagerLoadingError: polit_in_article is not associated to article。可能我错过了一些东西,但我真的不知道在这里做什么。我试图使文章表具有关联 as: 'polit_in_articles',直到我需要将政治家表也包括到查询中。

【问题讨论】:

    标签: javascript node.js express sequelize.js


    【解决方案1】:

    您需要在关联中使用through 关键字。 Articles 将具有 politicians through Polit_in_article 模型,但是由于您只是在其上使用主键,您可以让它被推断并省略 polit_in_article.js 并使用字符串来命名表。

    Politician.associate = (models) => {
      Politician.hasMany(models.Article, {
        foreignKey: 'politicianId',
        through: 'polit_in_article',
        as: 'articles',
      });
    };
    
    Article.associate = (models) => {
      Article.hasMany(models.Politician, {
        foreignKey: 'articleId',
        through: 'polit_in_article',
        as: 'politicians',
      });
    };
    

    现在您可以通过指定as 和through 来查询连接表。

    getAllArticlesOfPolitician(req) {
      return Article.findAll({
        include: [{
          model: Politician,
          as: 'politicians',
          through: 'polit_in_article',
          where: {
            lastname: req.query.politicianLastName,
          },
        }],
      })
      .then(response => response)
      .catch(err => err);
    }
    

    【讨论】:

      【解决方案2】:

      我只需要在 article.js 中修复关联,我与政治家而不是连接表建立关联:

      module.exports = (sequelize, DataTypes) => {
      
          const Article = sequelize.define('article', {
               ...
          });
      
          Article.associate = (models) => {
              Article.hasMany(models.Polit_in_article, {
                  foreignKey: 'articleId',
                  as: 'polit_in_articles'
              });
          };
          return Article;
      };
      

      【讨论】:

        猜你喜欢
        • 2019-09-02
        • 1970-01-01
        • 2016-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 2020-03-05
        相关资源
        最近更新 更多