Как сгенерировать запрос на объединение таблицы с помощью Sequelize? - PullRequest
1 голос
/ 09 января 2020

Допустим, есть две таблицы, а именно Пользователь и Роль пользователя. Отношение между пользователем и пользовательской ролью один ко многим. Модель Sequelize для пользователя выглядит следующим образом -

const user = sequelize.define(
  'user', {
    id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    userName: {
      type: DataTypes.STRING(200),
      allowNull: false,
      field: 'username'
    },
    password: {
      type: DataTypes.STRING(200),
      allowNull: false,
      field: 'password'
    }
  }, {
    tableName: 'user'
  }
);

Модель Sequelize для роли пользователя выглядит следующим образом -

const userRole = sequelize.define(
  'userRole', {
    id: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    userId: {
      type: DataTypes.BIGINT,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'user_id'
    },
    password: {
      type: DataTypes.STRING(200),
      allowNull: false,
      field: 'password'
    }
  }, {
    tableName: 'userRole'
  }
);

Ассоциация Sequelize определяется следующим образом -

user.hasMany(models.userRole, { foreignKey: 'user_id', as: 'roles' });
userRole.belongsTo(models.user, { foreignKey: 'user_id', as: 'user' });

Я хочу сгенерировать следующий запрос, используя

Sequelize -
SELECT * 
FROM   USER 
       INNER JOIN (SELECT user_role.user_id, 
                          role 
                   FROM   user_role 
                          INNER JOIN USER tu 
                                  ON tu.id = user_role.user_id 
                   GROUP  BY user_id 
                   ORDER  BY role) AS roles 
               ON USER.id = roles.user_id; 

Я разрабатываю API, который будет использоваться интерфейсной сеткой для отображения информации о пользователе. Существует функция поиска по атрибуту роли в таблице пользовательских ролей. Если какая-либо роль определенного пользователя c совпадает, то я ожидаю запись пользователя со всеми ролями, которые связаны с этим пользователем.

Ответы [ 2 ]

1 голос
/ 13 января 2020

Чтобы получить все роли, связанные с пользователем, даже если одна из них совпадает с запросом, вам нужно определить другую связь, чтобы можно было дважды включить таблицу ролей в оператор sequelize.

User.hasMany(models.UserRole, { foreignKey: 'user_id', as: 'roles2' });

Оператор Sequelize -

const userInfo = await User.findAndCountAll({
  include: [
    {
      model: UserRole,
      attributes: ['id', 'role'],
      as: 'roles',
      where: { [Op.or]: [{ role: { [Op.like]: '%MANAGER%' } },
      required: true
    },
    {
      model: UserRole,
      attributes: ['id', 'role'],
      as: 'roles2',
      required: true
    } 
  ],
  where: whereStatement,
});

С помощью первого включения (присоединения) вы можете фильтровать записи пользователей по роли пользователя и с помощью второго включения (присоединения) ), вы можете получить все роли пользователя, чья одна из ролей совпадает.

0 голосов
/ 09 января 2020

Вы должны использовать include (относительно do c: https://sequelize.org/master/manual/models-usage.html# -code-findandcountall - код ---- поиск по нескольким элементам в базе данных - return- и data-and-total-count )

Пример:


 Models.User.findAll({
    where :{
      id: userId
    },
    group: ['roles.user_id'],
    order: [['roles.role', 'ASC']] //or DESC, as you want
    include: {
      model: Models.UserRole,
      as: 'roles',
      attributes: ['user_id', 'role'],
      required: true
    },
  })

Надеюсь, это поможет вам

...