2016-06-10 107 views
1

我使用sequelize在我的節點應用程序中爲mySql數據庫模式建模。比方說,我有3個表:項目,用戶和角色。使用關聯和外鍵組合findAll

這是項目與用戶之間通過「Project_User」進行的「多對多」關聯,其中定義了用戶對項目的角色。

項目型號:

var Project = sequelize.define('Project', { 
    name:{type: DataTypes.STRING, unique: true} 
}, 
classMethods: { 
    associate: function(models) { 
     Project.belongsToMany(models.User, { through: 'Project_User', as: 'users'}); 
    } 
} 
// Methods... 
); 

用戶模型:

var User= sequelize.define('User', { 
    name:{type: DataTypes.STRING, unique: true} 
}, 
classMethods: { 
    associate: function(models) { 
     User.belongsToMany(models.Project, { through: 'Project_User', as: 'projects'}); 
    } 
} 
// Methods... 
); 

這裏是關聯表Project_User型號

var Project_User = sequelize.define('Project_User', { 
    role: 
    { 
     type: DataTypes.INTEGER, 
     allowNull: false, 
     references: 'Role', 
     referencesKey: 'id' 
    } 
},{ 
    classMethods: { 
     associate: function(models) { 
      Project_User.belongsTo(models.Role, {foreignKey: 'role'}); 
     } 
    } 
}); 

現在,我想找到所有項目,與他們的用戶和他們的角色。所以我使用的findAll與「包含」這樣設置:

models.Projects.findAll({ 
    include:[ 
      { 
       model: models.User, 
       as:'users', 
       through: {attributes: ['role'], as: 'role'} 
      }] 
}).then(function(result) { 
    // ... 
}); 

這個偉大的工程,但我只有與用戶關聯的角色ID。我沒有能夠與角色表,以獲得其他屬性,如角色名鏈接這種「角色ID」 ......

這裏是JSON我有:

[ 
{ 
    "id": 1, 
    "name": "Project name", 
    "users": [ 
     { 
      "id": 1, 
      "name": "User name", 
      "role": { 
       "role": 1 
      } 
     } 
    ] 
} 
] 

但我會希望有這樣的事情:

[ 
{ 
    "id": 1, 
    "name": "Project name", 
    "users": [ 
     { 
      "id": 1, 
      "name": "User name", 
      "role": { 
       "id": 1, 
       "name": "Role name", 
       "description": "Some info...", 
      } 
     } 
    ] 
} 
] 

我試過很多事情要實現這種關聯,甚至連續包括但不成功。 findAll選項需要什麼才能獲得此JSON結果?

感謝

回答

0

假設你User模型鏈接到Role模型,這樣的事情應該工作:

models.Projects.findAll({ 
    include:[ 
      { 
       model: models.User, 
       as:'users', 
       through: {attributes: []}, 
       include: [models.Role] 
      }] }).then(function(result) { 
    // ... }); 
+0

感謝您的答覆,但我已經嘗試,並沒有工作。事實上,我有一個像「未知列users.role」這樣的錯誤是有道理的,因爲角色不是來自用戶表的列,而是來自project_user。 – Raptack

+0

如果您沒有用戶和角色之間的關係,那麼您唯一的選擇是對連接表(project_user)建模並將關係添加到角色。如果不定義關聯,則無法檢索完整模型數據(表格的一行)... – Aralizer

+1

是的,這就是我所做的。您可以看到我的Projet_User模型,與角色(roleId作爲外鍵)的關係。但是我在我的** findAll()**中找不到正確的語法來顯示角色數據,而不僅僅是與項目關聯的每個用戶的外鍵roleId。 – Raptack