В дальнейшем, как запросить модель, связанную с «через» - PullRequest
0 голосов
/ 22 декабря 2018

Я очень новичок в Sequelize и мне нужна помощь, чтобы создать метод для запроса между двумя таблицами.Я дал три модели с именами " user ", " project " и " user_project ".

user_project хранит отношения между пользователями и проектами.Он использует два внешних ключа (user_id и project_id) из других таблиц.Кроме того, user_project имеет поле с именем "role", чтобы указать роль пользователя в проекте.Я пытаюсь найти способ извлечения пользовательских ролей на основе пользовательской «электронной почты».Обратите внимание, что электронная почта пользователя сохраняется в пользовательской таблице.

Ассоциации между ними следующие:

  models.project.belongsToMany(models.user, {
    through: models.user_project,
    foreignKey: {
      name: 'projectId',
      field: 'project_id'
    }
  });

  models.user.belongsToMany(models.project, {
    through: models.user_project,
    foreignKey: {
      name: 'userId',
      field: 'user_id'
    }
  });

Заранее спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

Знайте, что это очень поздно, но надеюсь, что это будет кто-то еще в будущем -

Используя необработанный запрос и затем преобразовывая строку ролей в массив -

User.findOne({
    where: {email},
    attributes: [
        'id', 'email',
        [Sequelize.literal("(SELECT GROUP_CONCAT(roles) FROM user_project UP WHERE UP.user_id=user.id )"), "roles"],
    ]
}).then( (user) => {

    if(!user)
        return null;

    user = JSON.parse(JSON.stringify(user));

    if(!user.roles)
        user.roles = [];
    else
        user.roles = user.roles.split(",");

    return user;

});

Получение ролей без использования Raw -

User.findOne({
        where: {email},
        attributes: [
            'id', 'email'
        ],
        include: [
            {
                model: Db.user_project,
                required: false,
                attributes: ["user_id", "roles"]
            }

    ]
}).then( (user) => {

    if(!user)
        return null;

    user = JSON.parse(JSON.stringify(user));

    if(!user.roles)
        user.roles = [];
    else
        user.roles = user.roles.map(r => r.roles);

    return user;

});
...