продолжение: объединение трех таблиц

#node.js #postgresql #sequelize.js

#node.js #postgresql #sequelize.js

Вопрос:

Рассмотрим эти таблицы

 const User = sequelize.define('users', {
  name: {
    type: Sequelize.TEXT
  },
  password: {
    type: Sequelize.TEXT
  },
  status: {
    type: Sequelize.BIGINT,
    field: 'statusId',
  },
  date_of_birth: {
    type: Sequelize.DATE
  },
});

const Status = sequelize.define('statuses', {
  name: {
    type: Sequelize.TEXT
  },
});


const UserRate = sequelize.define('user_rates', {
  title: {
    type: Sequelize.TEXT
  },
  user: {
    type: Sequelize.BIGINT,
    field: 'userId'
  },
  comment: {
    type: Sequelize.TEXT
  },
  rate: {
    type: Sequelize.NUMBER
  },
});


User.belongsTo(Statuses, { foreignKey: 'statusId', as: 'userStatus'})

User.hasMany(UserRate, { foreignKey: 'userId', as: 'userRate' })

UserRate.findAll({ include: ['userRate']});
  

запрос выполняется хорошо, я понимаю это:

  {
       title: 'test',
       rate: 4,
       user: 1,
       comment: 'test',
       userRate: {
          name: 'test',
          password: 'test',
          status: '1',
          date_of_birth: '11/22/1111',
       }
    }
  

но если я хочу получить это:

 {
       title: 'test',
       rate: 4,
       user: 1,
       comment: 'test',
       userRate: {
          name: 'test',
          password: 'test',
          status: '1',
          date_of_birth: '11/22/1111',
          userStatus: {
             name: 'active',
             id: 1,
          }
       }
    }
  

я хочу включить статус в пользовательский объект. Я посмотрел много мест, но не могу найти решение для этого. я даже пытаюсь это:

 UserRate.findAll({ include: ['userRate', 'userStatus]});
  

но это вообще не сработало

я пытался использовать belongsToMany, но мне не удалось заставить его работать, возможно, я как-то неправильно это делаю. очень признателен за любую помощь

Ответ №1:

UserRate не имеет прямой связи / отношения с UserStatus . Итак, вы должны включить его в пользовательскую модель.

 UserRate.findAll({
    include: [{
        model: User, as: 'userRate',
        include: [{
            model: Status, as: 'userStatus',
        }],
    }],
});
  

Не путайте массив объектов в include, если вы видите это впервые. Вы можете включить больше моделей, которые должны иметь ассоциацию / отношение, определенные с родительским элементом, который включает его.