【问题标题】:Sequelize error using association on n:m related objects使用 n:m 相关对象上的关联来处理错误
【发布时间】:2020-05-30 05:30:30
【问题描述】:

我正在为当前项目使用 nodeJS、express (4.17.1)、sequelize (5.21.4) 和 mysql (mysql2 v2.1.0)。

在我的数据库中,我有三个表 Filter、Element 和 FilterElement。如果我分别从过滤器或元素表中查询数据库中的数据,我会得到带有数据的对象的结果。如果我想使用“连接”表 FilterElement 我会收到此错误 {"name":"SequelizeEagerLoadingError"}

EagerLoadingError [SequelizeEagerLoadingError]: filter_element 不是 关联到 filters_new!

我的代码有什么问题? 这些是我的续集对象代码。

过滤器.js

const Sequelize = require('sequelize');
const db = require('../config/database');

const Filter = db.define('filters_new', {
    Model:{
        type: Sequelize.STRING,
        primaryKey: true,
        allowNull: false
    }
},
    {
        timestamps: false,
        freezeTableName: true
    }
);


Filter.associate = function(models) {
    Filter.belongsToMany(models.Element, {
      through: models.FilterElement,
      as: 'filter',
      foreignKey: 'FilterHousingModel'
    });
  };


module.exports = Filter;

元素.js

const Sequelize = require('sequelize');
const db = require('../config/database');

const Element = db.define('filter_element', {
    idfilter_element:{
        type: Sequelize.INTEGER,
        primaryKey: true,
        allowNull: false
    },
    ElementName:{
        type: Sequelize.STRING,
    }  
},
    {
        timestamps: false,
        freezeTableName: true
    }
);



Element.associate = function(models) {
    Element.belongsToMany(models.Filter, {
      through: models.FilterElement,
      as: 'element',
      foreignKey: 'FilterElementId'
    });
  };


module.exports = Element;

FilterElemnt.js

const Sequelize = require('sequelize');
const db = require('../config/database');

const FilterElement = db.define('filters_new', {
    idfilter_filterelement:{
        type: Sequelize.STRING,
        primaryKey: true,
        allowNull: false,
        autoincrement: true
    },
    FilterHousingModel: {
        type: Sequelize.STRING
    },
    FilterElementId: {
        type: Sequelize.INTEGER        
    }
},
    {
        timestamps: false,
        freezeTableName: true
    }
);



module.exports = FilterElement;

如果我调用这个函数,我确实会从数据库中得到想要的数据结果。

listFiltersOnly(req, res) {
    
        return filter.findAll()
        .then((filters) => { 
            res.status(200).send(filters);
        })
        .catch(err => {
            console.log(err);
            res.status(400).send(err);
        });
    }

然后,如果我调用函数列表,我会收到上面提到的错误 EagerLoadingError

list(req, res) {
        return filter.findAll({
            include: [{
                model: element,
                as: 'element'
            }],
        })
        .then((filters) => { 
            console.log(filters);
            res.status(200).send(filters);
        })
        .catch(err => {
            console.log(err);
            res.status(400).send(err);
        });
    }

寻找一些可能是哪里问题的建议?

【问题讨论】:

  • 我在 sequelize V5 参考中找不到“Model.associate”的任何参考。我所看到和知道的是直接使用诸如“belongsTo”、“hasMany”之类的关联函数。您是否在实现中手动调用 Model.associate ?

标签: javascript mysql node.js sequelize.js


【解决方案1】:

@RatulSharker 我从模型中删除了关联并将其添加到模型在控制器中实现的位置,现在我确实得到了一些结果。

Filter.belongsToMany(FilterElement, {
    through: FilterFilterElement,
    foreignKey: 'FilterHousingModel'
});


FilterElement.belongsToMany(Filter, {
    through: FilterFilterElement,
    foreignKey: 'FilterElementId'
});

谢谢@Ratul Sharker

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多