Секвелизировать ассоциации 2 таблицы с внешними ключами - PullRequest
0 голосов
/ 18 июня 2020

У меня проблема с продолжением. Мне нужно использовать JOIN, но я не могу установить отношения. Это мои модели (Пользователь уменьшен, он действительно большой, и единственное поле, которое мне нужно для этого, - NR_UTILIZADOR):

var UtilizadoresModel = sequelize.define('UTILIZADORES', {
    NR_UTILIZADOR: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
    }
}, {
    freezeTableName: true,
    paranoid: true,
    timestamps: true,
    hooks: {
        beforeCreate: (user, options) => {
            return bcrypt.hash(user.PASSWORD, 10)
                .then(hash => {
                    user.PASSWORD = hash
                })
                .catch(err => {
                    throw new Error()
                })
        },
    },
})

var Validacoes = sequelize.define('VALIDACOES', {
    NR_VALIDACAO: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    NR_VALIDADO: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
            model: Utilizadores,
            key: 'NR_UTILIZADOR'
        }
    },
    NR_VALIDADOR: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
            model: Utilizadores,
            key: 'NR_UTILIZADOR'
        }
    },
    DATA_HORA_VALIDACAO: {
        type: Sequelize.DATE,
        allowNull: false
    },
    ESTADO: {
        type: Sequelize.ENUM('APROVADO', 'DESAPROVADO'),
        allowNull: false
    }
}, {
    freezeTableName: true,
    timestamps: false,
})

Я делаю это:

User.hasMany(Validacoes, {
    foreignKey: 'NR_UTILIZADOR'
})
Validacoes.belongsTo(User)

Мне нужно чтобы связать NR_VALIDADO и NR_VALIDADOR из Validacoes с NR_UTILIZADOR из Utilizadores.

Когда я пытаюсь выполнить findAll с помощью include, я получаю следующее:

    await User.findAll({
        attributes: [
            'NR_UTILIZADOR',
            'NOME_UTILIZADOR',
            'FREGUESIA',
            'createdAt',
            'NR_VALIDADOR',
        ],
        where: {
            VALIDADO: false,
            deletedAt: {
                [Op.ne]: null
            },
            ESTADO: 'DESAPROVADO'
        },
        order: [
            ['createdAt', 'ASC'],
        ],
        include: [{
            model: Validacoes
        }],
        paranoid: false
    })
original: error: column VALIDACOES.NR_UTILIZADOR does not exist

Спасибо всем за ваше время

1 Ответ

1 голос
/ 18 июня 2020

Согласно определениям вашей модели столбец NR_UTILIZADOR отсутствует в Validacoes, поскольку вы пытаетесь объявить его с помощью

User.hasMany(Validacoes, {
    foreignKey: 'NR_UTILIZADOR'
})

Это определение ассоциации говорит, что Validacoes имеет NR_UTILIZADOR, который связан с User. Я полагаю, вы должны определить ассоциации между Validacoes и User следующим образом:

// you should add an alias to each association 
// to distinguish two links to User from each other
// as well as two Validacoes links.
Validacoes.belongsTo(User, { foreignKey: 'NR_VALIDADO', as: 'Validado' })
Validacoes.belongsTo(User, { foreignKey: 'NR_VALIDADOR', as: 'Validador' })
User.hasMany(Validacoes, { foreignKey: 'NR_VALIDADO', as: 'ValidadoValidacoes' })
User.hasMany(Validacoes, { foreignKey: 'NR_VALIDADOR', as: 'ValidadorValidacoes' })

И НАКОНЕЦ ваш запрос Sequelize будет выглядеть примерно так:

await User.findAll({
        attributes: [
            'NR_UTILIZADOR',
            'NOME_UTILIZADOR',
            'FREGUESIA',
            'createdAt',
            'NR_VALIDADOR', // this column does not exist in User model
        ],
        where: {
            VALIDADO: false,
            deletedAt: {
                [Op.ne]: null
            },
            ESTADO: 'DESAPROVADO'
        },
        order: [
            ['createdAt', 'ASC'],
        ],
        include: [{
          model: Validacoes,
          as: 'ValidadoValidacoes'
        }, {
          model: Validacoes,
          as: 'ValidadorValidacoes'
        }],
        paranoid: false
    })
...