Подтвердить что ты не робот

Ассоциация преувеличивает 3 таблицы, многие для многих

У меня есть 4 таблицы

- client
- project
- user
- userProject

Один проект принадлежит клиенту, и ему нужно иметь клиентский ключ client_id.

У UserProject есть внешние_страницы project_id и user_id, принадлежащие проекту и пользователю.

Один пользователь владеет клиентами своих проектов.

  • Как я могу перечислить клиентов одного пользователя?
4b9b3361

Ответ 1

Мне интересно, что вы можете использовать загружаемую функцию из sequalize:

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

Ответ 2

Это создает отношение "много-ко-многим" между user и project. Между user и client вы должны иметь отношение "много-ко-многим-к-одному". Это не поддерживается 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);
});