问题描述
我在做什么?
我正在尝试使用 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 - 哇,关联以正确的方式工作。