协会续集3个表,多对多

时间:2014-03-11 20:35:34

标签: node.js sequelize.js

我有4张桌子

- client
- project
- user
- userProject

一个项目属于客户端,它需要客户端外键client_id。

UserProject具有project_id和user_id外键,属于项目和用户。

一个用户拥有他的项目的客户。

  • 如何列出一个用户的客户?

2 个答案:

答案 0 :(得分:8)

我想知道您可以使用eager loading中的sequalize功能:

Client.findAll({
  include: [{
    model: Project,
    include: [{
      model: User,
      where: {
        id: <UserId>
      },
      required: false
    }]
  }]
}).then(function(clients) {
  /* ... */
});

答案 1 :(得分:2)

这会在userproject之间创建多对多关系。在userclient之间,你有一个多对多的关系。 sequelize不支持此功能。我会在User模型上创建一个实例方法,如下所示:

User = sequelize.define('user', {
  // ... definition of user ...
},{
  instanceMethods: {
    getClients: function()  { 
      return this.getProjects().then(function (projects) {
        var id_map = {};
        for (var i = 0; i < projects.length; i++) {
          id_map[projects[i].clientId] = 1;
        }
        return Client.findAll({
          where: { id: [Object.keys(id_map)] }
        });
      });
    }
  }
});

然后在拥有这样的用户实例时调用此函数来获取客户端:

user.getClients().then(function (clients) {
  console.log(clients);
});