【问题标题】:Unable to develop assosciations between models in sequelize无法在 sequelize 中开发模型之间的关联
【发布时间】:2021-12-28 07:01:23
【问题描述】:

我正在用户模型和任务模型之间创建关系(一对多) 我也在迁移中创建了参考列 我正在使用带有 sequelize cli 的 sequlize ORM。当我尝试替代方法时一切正常,我稍后会解释,但如果我尝试根据文档进行操作,它会给我错误

任务未与用户关联

工作替代方法

我在 index.js 文件的末尾创建了关系,它按预期工作

db.user = require("../models/user.js")(sequelize, Sequelize);
db.tasks = require("../models/Task.js")(sequelize, Sequelize);

db.user.hasMany(db.tasks, { as: "user_tasks",foreignKey: "userId" });
db.tasks.belongsTo(db.user, {
  foreignKey: "userId",
  as: "task_user",
});

但是当我按照文档进行操作时,我遇到了我之前提到的错误

根据文件

模型 User.js

module.exports = (sequelize, DataTypes) => {
  const User =sequelize.define('User',{
    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      allowNull: false,
      primaryKey: true,
   },
   name: {
      type: DataTypes.STRING,
      allowNull: false,
   },
   age: {
      type: DataTypes.INTEGER,
   },
   email: {
      type: DataTypes.STRING,
   },
   createdAt: {
    allowNull: false,
    type: DataTypes.DATE
  },
  updatedAt: {
    allowNull: false,
    type: DataTypes.DATE
  }

});

User.associate = (模型) =>{

User.hasMany(models.Tasks, {
  as: 'user_tasks',
  foreignKey: 'userId'}
);

};

返回用户; };

模型:Task.js

module.exports = (sequelize, DataTypes) => {

  const Task = sequelize.define('Task', {

    id: {
      type: DataTypes.INTEGER,
      autoIncrement: true,
      allowNull: false,
      primaryKey: true,
   },
   title: {
      type: DataTypes.STRING,
      allowNull: false,
   },
   userId: {
      type: DataTypes.INTEGER,
   },
    });


    Task.associate = function(models) {
      Task.belongsTo(models.User, { 
        as:'owner',
        foreignKey:'userId',
         onDelete: "cascade"
        });
    };
  
    return Task;
}

这就是我试图从数据库中获取数据的方式 控制器

const User = db.user 
const {Tasks} = db.tasks

exports.usertasks = async(req,res)=>{

// const users =  await User(db.sequelize,db.Sequelize).findAll({
const users =  await User.findAll({
    
    include:[{model:Tasks,as:"user_tasks"}]
});
res.json(users)
console.log("All users with their associated tasks:", JSON.stringify(users, null, 4));

}

我的 Index.js 文件

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    
    const model = require(path.join(__dirname+'../models/', file))(sequelize, Sequelize.DataTypes);
console.log(model);

    
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;
                                                    //relations THIS IS WORKING AND I AM JUST CURIOUS WHETHER TO USE THIS APPROACH OR NOT


// db.user = require("../models/user.js")(sequelize, Sequelize);
// db.tasks = require("../models/Task.js")(sequelize, Sequelize);

// db.user.hasMany(db.tasks, { as: "user_tasks",foreignKey: "userId" });
// db.tasks.belongsTo(db.user, {
//   foreignKey: "userId",
//   as: "task_user",
// });
module.exports = db;

我还附上了使用替代方法获得的成功响应的图片。

请指导我使用的替代方法是否可以接受,或者我应该坚持使用文档吗?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    .associate不是原生Model的方法,需要手动调用。
    我认为在您的index.js 中您想要执行以下操作:

    'use strict';
    
    const Sequelize = require('sequelize');
    const config = require('../config/config.json')[process.env.NODE_ENV || 'development'];
    const requireAll = require('require-all');
    
    const sequelize = config.use_env_variable
      ? new Sequelize(process.env[config.use_env_variable], config)
      : new Sequelize(config.database, config.username, config.password, config);
    
    const db = { sequelize };
    
    const modelsInitializers = Object.values(requireAll({
      dirname: __dirname,
      recursive: false,
      filter: (name) => name !== 'index.js' && name,
    }));
    
    const models = modelsInitializers.map((initializer) => {
      const model = initializer(sequelize, Sequelize.DataTypes);
      db[model.name] = model;
      return model;
    });
    
    models.forEach((model) => {
      if (model.associate) model.associate(db);
    })
    
    models.forEach((model) => {
      if (model.associate) model.associate(models);
      db[model.name] = model;
    })
    
    
    Object.entries().forEach(([modelName, model]) => {
      model.associate(models);
      db[modelName] = model;
    });
    
    module.exports = db;
    

    【讨论】:

    • 它已经存在于 index.js 文件中,正如我所提到的,我使用的是 sequlize-cli,所以当我运行 init 命令时,它会生成带有 index.php 的模型以及其他所需的文件夹
    • 你能更新你的问题并在那里添加你当前的index.js吗?
    • 对不起,我应该早点做的。我已经编辑了我的问题
    • 我已经更新了我的答案。抱歉,如果它不适合您的情况。祝你好运!
    • 请解释一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多