使用 ES6 和默认创建的模型关联模型与模型无关

问题描述

我在做什么?

我正在尝试使用 CLI 认创建的模型将关联添加到我的文件夹模型。 重要的一点是,我试图将模型与他自己联系起来,所以 Folder.hasMany.Folder.

我想达到什么目的?

我的期望是,当我使用这个查询时:

const folders = Folder.findAll({where:{parent_id: null},include: [{model: Folder,as: 'children'}]});

我应该在 children 属性获取带有孩子的文件夹结构。

但不是这样,我不断收到错误文件夹(模型)与文件夹(模型)无关

这是我的文件夹模型的代码

'use strict';
const { Sequelize,Model } = require('sequelize');

module.exports = (sequelize,DataTypes) => {
class Folder extends Model {
    static associate(models) {
        Folder.hasMany(models.Folder,{
            foreignKey: 'parent_id',as: 'children'
        });
        Folder.belongsTo(models.Folder,as: 'parent'
        });
    }
};
Folder.init({
    title: DataTypes.STRING,parent_id: { 
        type: DataTypes.INTEGER,references: {
            model: Folder,key: 'id',onDelete: 'cascade'
        }
    },user_id: { 
        type: DataTypes.INTEGER
    }
},{
    timestamps: false,tableName: 'folders',sequelize,modelName: 'Folder',});
    return Folder;
};

这是我与数据库的连接:

const Sequelize = require('sequelize');
const sequelize = new Sequelize('database_name','user','pass',{
    host: "localhost",dialect: "MysqL",timezone: '+01:00' //Europe - Belgrade
});

sequelize
    .authenticate()
    .then(() => {
        console.log("Database connected successfully!");
    })
    .catch((error) => {
        console.log(error);
});

const models = {
  Folder: require('../models/Folder')(sequelize,Sequelize)
};
Object.values(models)
  .forEach(model => model.associate(models));

module.exports = sequelize;
global.sequelize = sequelize;

解决方法

如果有人更感兴趣,我解决了将连接文件更改为这个的问题:

const Sequelize = require('sequelize');
const sequelize = new Sequelize('bookmarkwizard','root',{
    host: "localhost",dialect: "mysql",timezone: '+01:00' //Europe - Belgrade
});

sequelize
    .authenticate()
    .then(() => {
        console.log("Database connected successfully!");
    })
    .catch((error) => {
        console.log(error);
});

const models = require('../models/index');

module.exports = {
    models,sequelize
};
global.sequelize = sequelize;
global.models = models;

本质是您应该需要 index.js(来自 Models 文件夹),因为该文件处理关联。我还将它导出为全局,并将模型称为 models.ModelName - 哇,关联以正确的方式工作。