【问题标题】:How to do a Many to Many relationship in Sequelize?如何在 Sequelize 中建立多对多关系?
【发布时间】:2021-08-19 20:01:04
【问题描述】:

这些是我的模型: 员工

const { DataTypes } = require('sequelize');
const sequelize = require('../sequelize')

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

name: {
    type: DataTypes.STRING,
    allowNull: false,
},
SSN: {
    type: DataTypes.INTEGER,
},
email:{
    type: DataTypes.STRING,
}
}, {
    timestamps: true
});
Staff.associate = function (models) {
    Staff.belongsToMany(models.Technology, {through: models.StaffTechnology});

};

module.exports = Staff;

技术:

const { DataTypes } = require('sequelize');
const sequelize = require('../sequelize')


const Technology = sequelize.define('Technology', {
    name: {
        type: DataTypes.STRING,
        allowNull: false,
    },
    description: {
        type: DataTypes.STRING,

    }
}, {
    timestamps: true
});
Technology.associate = function (models) {
    Technology.belongsToMany(models.Staff, { through: models.StaffTechnology});

};
module.exports = Technology;

这将是连接表:

const { DataTypes } = require('sequelize');
const sequelize = require('../sequelize')
const Staff = require('../../database/models/staff.model');
const Technology = require('../../database/models/technology.model');


const StaffTechnology = sequelize.define('StaffTechnology', {
    experience: {
        type: DataTypes.INTEGER,
    },
    StaffID: {
        type: DataTypes.INTEGER,
        references: {
            model: Staff, 
            key: 'id'
        }
    },
    TechnologyID: {
        type: DataTypes.INTEGER,
        references: {
            model: Technology,
            key: 'id'
        }
    },
}, {
    timestamps: true
});
StaffTechnology.associate = function (models) {
      //StaffTechnology.hasMany(models.Staff, { foreignKey: 'StaffID' });
      //StaffTechnology.hasMany(models.Technology, { foreignKey: 'TechnologyID' });
};

module.exports = StaffTechnology

现在我不能执行 Staff.findAll({include:Technology}),因为它给了我一个错误,说 Staff 和 Technology 没有关联,但是我看到了 Sequelize 文档,并且我看到了一个非常相似的示例。 我想要的是返回 All Staff 及其技术的可能性,Staff 可以拥有许多技术,Technology 可以属于 Many Staff,但实际上它们是通过 StaffTechnology 连接表连接的。

【问题讨论】:

    标签: javascript node.js database orm sequelize.js


    【解决方案1】:

    您需要在 index.js(或初始化数据库的位置)中声明关联。您可以通过要求模型并直接声明关联来手动完成

    Model1.association(Model2, {
      through: "JoinTable"
    }
    
    Model2.association(Model1, {
      through: "JoinTable"
    }
    

    或者以编程方式进行(如果您已经在使用该方法来初始化数据库):

    'use strict'
     
    const fs = require('fs');
    const path = require('path');
    const Sequelize = require('sequelize');
    const basename = path.basename(__filename);
    const config = {
      "username": "root",
      "password": "YOUR ROOT PASSWORD HERE",
      "database": "YOUR DATABASE NAME HERE",
      "host": "127.0.0.1",
      "dialect": "mysql"
    }
    const db = {}
     
    let 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, file))(sequelize, Sequelize.DataTypes);
        db[model.name] = model;
      });
     
    Object.keys(db).forEach(modelName => {
      if (db[modelName].associate) {
        db[modelName].associate(db);
      }
    });
     
    db.sequelize = sequelize;
    db.Sequelize = Sequelize;
     
    module.exports = db;
    

    ^ 此代码将初始化和关联合二为一。您需要确保您的模型文件和初始化文件在同一个文件夹中。

    【讨论】:

    • MAN 那行,我只有 2 个模型文件夹,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 2022-07-08
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    相关资源
    最近更新 更多