首页 > 解决方案 > Sequelize 别名关联上的急切加载错误

问题描述

嗨,我有以下 index.js

var fs = require('fs');
var path = require('path');
var Sequelize = require('sequelize');
var CONFIG = require('../config/config');

var sequelize = new Sequelize(CONFIG.database, CONFIG.user, CONFIG.password, {
  host: CONFIG.host,
  dialect: CONFIG.dialect,
  port: CONFIG.port,
  operatorsAliases: Sequelize.Op,
  logging: false
});

var db = {};


fs.readdirSync(__dirname)
  .filter(function (file) {
    return (file.indexOf('.') !== 0) && (file !== 'index.js');
  })
  .forEach(function (file) {
    var model = sequelize.import(path.join(__dirname, file));
    db[model.name] = model;
  });

Object.keys(db).forEach(function (modelName) {
  if ('associate' in db[modelName]) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

而且我想包含两次具有不同条件的模型,因此我计划在这种情况下使用别名:

module.exports = function (sequelize, DataTypes) {
  var TSection = sequelize.define('TSection', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    name: {
      type: DataTypes.STRING(500),
      allowNull: true
    },
    TestId: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      field: 'test_id',
      references: {
        model: 'test',
        key: 'id'
      }
    },
  },
  {
    tableName: 't_sections'
  });
  
  TSection.associate = function (models) {
    TSection.belongsTo(models.Test), {
      foreignKey: 'id',
      as: 'sections'
    },
    TSection.hasMany(models.TQuestion), {
      foreignKey: 'id'
    }
  };

  return TSection;
};

module.exports = function (sequelize, DataTypes) {
  var Test = sequelize.define('Test', {
    id: {
      type: DataTypes.INTEGER(11),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true
    },
    name: {
      type: DataTypes.STRING(500),
      allowNull: true,
    },
  },
  {
    tableName: 'tests'
  })
  Test.associate = function (models) {
    Test.hasMany(models.TSection), {
      foreignKey: 'id'
    }
  }

  return Test;
};

当我尝试获取以下信息时:

const test = await Test.findOne({
   attributes: ['id', 'name'],
   include: [{
     model: TSection,
       attributes: ['id', 'name'],
     }, {
     model: TSection,
       as: 'sections'
     }]
 });

我有这个错误,我不知道是什么原因造成的:注意:我尝试了几种组合,包括和不包括上述模型

UnhandledPromiseRejectionWarning: Error: Error: SequelizeEagerLoadingError: TSection is associated to Test using an alias. You've included an alias (sections), but it does not match the alias(es) defined in your association (TSections).

我想你想知道我的目标是计算总部分的数量,但只检索一个(与给定条件匹配的那个)

谢谢!

标签: sequelize.jseager-loadingmodel-associations

解决方案


您在关联中添加了额外的括号。它们应该如下所示:

TSection.associate = function (models) {
    TSection.belongsTo(models.Test, {
      foreignKey: 'id',
      as: 'sections'
    });
    TSection.hasMany(models.TQuestion, {
      foreignKey: 'id'
    });
  };

Test.associate = function (models) {
    Test.hasMany(models.TSection, {
      foreignKey: 'id'
    })
  }

推荐阅读