Sequelize ORM, крючки не работают с ассоциациями - PullRequest
0 голосов
/ 13 мая 2018

У меня есть 2 модели: Департамент и Персонал, и они связаны через ассоциацию ownToMany.

Теперь мне нужно вызывать функцию всякий раз, когда вызывается staff.addDepartment. Я пытаюсь использовать хуки, и в документации по сиквелизу говорится, что «При использовании функций добавления / установки будут работать хуки beforeUpdate / afterUpdate».

enter image description here

Но после некоторого времени, пытаясь заставить его работать, ловушка 'afterUpdate' все еще не вызывается, когда вызывается addDepartment

Модель персонала

module.exports = (sequelize, DataTypes) => {
      const Staff = sequelize.define('Staff', {          
        workingLocation: {
          type: DataTypes.STRING,
          allowNull: true,
        },           
      },
      {
        freezeTableName: true,
        hooks: {
          afterCreate: (instance, options) => {
            console.log('\n\n\nSTAFF -> Hook associting staff to department: \n\n\n', staffDepartment);
          },            
          beforeUpdate: (instance, options) => {
            console.log('\n\n\n Before update model \n\n\n', staffDepartment);
          },
          afterUpdate: (instance, options) => {
            console.log('\n\n\nAfter update model \n\n\n', staffDepartment);
          },
        },
      }
      );

        Staff.associate = (models) => {

          Staff.belongsTo(
            models.Person,
            {
              foreignKey: {
                allowNull: false,
              },
              onDelete: 'CASCADE',
            }
          );


          Staff.belongsToMany(models.Department,
            {
              through: 'StaffDepartment',
              onDelete: 'CASCADE',
              onUpdate: 'CASCADE',                 
            }
          );
        };

      return Staff;
    };

Модель отдела

module.exports = (sequelize, DataTypes) => {
  const Department = sequelize.define('Department', {
    name: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
    },
    acronym: {
      type: DataTypes.STRING,
      allowNull: true,
    },
  },
  {
    freezeTableName: true,
    hooks: {
      afterCreate: (staffDepartment, options) => {
        console.log('\n\n\Department -> Hook associting staff to department: \n\n\n', staffDepartment);
      },         
      beforeUpdate: (staffDepartment, options) => {
        console.log('\n\n\n Department Before update model \n\n\n', staffDepartment);
      },
      afterUpdate: (staffDepartment, options) => {
        console.log('\n\n\n Department After update model \n\n\n', staffDepartment);
      },
    },
  }
  );

  Department.associate = (models) => {         
    Department.belongsToMany(models.Staff,
        {
          through: 'StaffDepartment',
          onDelete: 'CASCADE',
          onUpdate: 'CASCADE',             
        }
      );

    Department.hasMany(models.Course,
      {
        onDelete: 'CASCADE',
        onUpdate: 'CASCADE',
      }
    );
  };

  return Department;
};

Код, который я хотел бы активировать после обновления на модели персонала

  Staff.findById(staff.id).then((s) => {                  
                s.addDepartment(departmentId);                
            });

Может кто-нибудь помочь?

...