2015-09-23 149 views
0

我正在使用Sequelize.js創建一些表。這些模型是用戶,商店,角色和ShopUserRoles。在模型之間創建關聯

我已經宣佈在models/文件夾喜歡的機型:

user.js的

module.exports = function (sequelize, DataTypes) { 
    var User = sequelize.define('User', { 
     id : { 
      type: DataTypes.STRING, 
      unique: true, 
      primaryKey : true 
     }, 
     fullName : { 
      type: DataTypes.STRING, 
      field: 'full_name', 
      allowNull : false 
     }, 
    }, { 
     tableName: 'users', 

     classMethods: { 
      associate: function(models) { 
       User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' }); 
      } 
     }, 
     timestamps: true, 
     createdAt : 'created_at', 
     updatedAt : 'updated_at' 
    }); 

    return User; 
}; 

Shop.js

module.exports = function(sequelize, DataTypes) { 
    var Shop = sequelize.define('Shop', { 
     id : { 
      type : DataTypes.INTEGER, 
      unique : true, 
      primaryKey : true 
     }, 
     shopName : { 
      type : DataTypes.STRING, 
      field : 'shop_name', 
      allowNull : false 
     }, 
     status : { 
      type: DataTypes.STRING 
     } 
    }, { 
     tableName : 'shops', 

     classMethods : { 
      associate : function(models) { 
       Shop.hasMany(models.ShopUserRoles, {foreignKey : 'shop_id'}); 
      } 
     }, 
     timestamps : true, 
     createdAt : 'created_at', 
     updatedAt: 'updated_at' 
    }); 

    return Shop; 
}; 

Role.js

module.exports = function(sequelize, DataTypes){ 
    var Role = sequelize.define('Role', { 
     id : { 
      type: DataTypes.INTEGER, 
      unique: true, 
      primaryKey: true 
     }, 
     name : { 
      type: DataTypes.STRING, 
      unique: true 
     } 
    }, { 
     tableName : 'roles', 

     classMethods : { 
      associate : function(models) { 
       Role.hasMany(models.ShopUserRoles, {foreignKey: 'role_id'}); 
      } 
     }, 
     timestamps : true, 
     createdAt : 'created_at', 
     updatedAt: 'updated_at' 
    }); 

    return Role; 
}; 

ShopU serRoles.js

module.exports = function(sequelize, DataTypes) { 
    var ShopUserRoles = sequelize.define('ShopUserRoles', { 
    }, { 
     tableName : 'shop_user_roles', 

     classMethods: { 
      associate: function(models) { 
       ShopUserRoles.belongsTo(models.User, {foreignKey: 'user_id' }); 
       ShopUserRoles.belongsTo(models.Shop, {foreignKey : 'shop_id'}); 
       ShopUserRoles.belongsTo(models.Role, {foreignKey: 'role_id'}); 
      } 
     }, 
     timestamps : true, 
     createdAt : 'created_at', 
     updatedAt : 'updated_at' 
    }); 

    return ShopUserRoles; 
}; 

而且我使用sequelize['import'](FILENAME)格式導入他們並添加相應的關聯。

現在,因爲我們已經添加了關聯,所以應該在生成前三個表之後創建表shop_user_roles,否則外鍵添加將不起作用。但是,我看到Sequelize正在試圖在users表創建之前創建此表。爲了解決這個問題,我有三種選擇:

  • 只有在表已創建
  • 分配表創建一個明確的排序或讓Sequelize「數字」的事情了智能
  • 試圖做分配協會整個事情兩次(這是笨拙的,我不希望它在開發代碼)

至於前兩個選項,我不完全確定如何做那些使用Sequelize.js。任何形式的參考或幫助將不勝感激。

我正在使用Sequelize.js v3.9。

回答

0

下面是我如何解決這個問題。不幸的是,這是一次暴力嘗試。

在我的應用程序中,我試圖導出包含模型名稱的數組,同時保持正確的順序。雖然我們可以使用associate類方法獲得模型之間的關聯,但也可以在模型的classMethods屬性內硬編碼創建表的序列。對於User模型,這可能是像

classMethods: { 
    serial: 1, 
    associate: function(models) { 
     User.hasMany(models.ShopUserRoles, {foreignKey: 'user_id' }); 
    } 
} 

之後,基於包含這些型號名稱可以做的伎倆陣列上的硬編碼的串行一個簡單的排序。

使用關聯爲了進行拓撲排序也是一個更好的方法。

相關問題