web-dev-qa-db-ja.com

SEQUELIZE(nodeJS)でTRIGGERを作成するにはどうすればよいですか?

Sequelizeを使用してトリガーを作成しようとしています。主なアイデアは、CONFIGを作成した後にUSERのインスタンスを作成することです。

// USER MODEL
module.exports = function(sequelize, DataTypes) {    
    var User = sequelize.define('User', {
        name        : DataTypes.STRING(255),
        email       : DataTypes.STRING(255),
        username    : DataTypes.STRING(45),
        password    : DataTypes.STRING(100),
    }, {
        classMethods : {
            associate : function(models) {
                User.hasOne(models.Config)
            }
        }
    });    
    return User;
};

// CONFIG MODEL
module.exports = function(sequelize, DataTypes) {
    var Config = sequelize.define('Config', {
        notifications   : DataTypes.INTEGER
    }, {
        classMethods : {
            associate : function(models) {
                Config.belongsTo(models.User)
            }
        }
    });

    return Config;
};

ご覧のとおり、「user」には「config」が1つあり、「config」は「user」に属しているため、ユーザーを作成した後、そのconfig行を自動的に作成します。

目標は次のことです。

DELIMITER //
CREATE TRIGGER create_config AFTER INSERT ON user
  FOR EACH ROW
BEGIN
    insert into config    (user_id)     values(new.user_id);
END; //
DELIMITER ;

さて、それをシミュレートするために私がすることは次のとおりです。

.then(function(user){
   return dao.Config.create(req.body, user, t);
})

ユーザーが作成されたら、そのような構成を作成します...それは機能しますが、私が探しているものではありません。

どうすればいいですか?

16
ElTête

これは、2つの方法のいずれかで実行できます。お気づきのように、データベース自体にトリガーを作成できます。これを実現するために、生の続編クエリを実行できます。

sequelize.query('CREATE TRIGGER create_config AFTER INSERT ON users' +
  ' FOR EACH ROW' +
  ' BEGIN' +
  ' insert into configs (UserId) values(new.id);' +
  'END;')

または、afterCreateイベントでアクションを実行するユーザーモデルに hook を作成することもできます。

module.exports = function(sequelize, DataTypes) {    
  var User = sequelize.define('User', {
    name        : DataTypes.STRING(255),
    email       : DataTypes.STRING(255),
    username    : DataTypes.STRING(45),
    password    : DataTypes.STRING(100),
  }, {
    classMethods : {
      associate : function(models) {
        User.hasOne(models.Config)
      }
    },
    hooks: {
      afterCreate: function(user, options) {
        models.Config.create({
          UserId: user.id
        })
      }
    }
  });
  return User;
};
32
Evan Siroky