Модель «обратная связь» не связана с моделью «пользователь» - Sequelize (Node JS) - PullRequest
0 голосов
/ 20 июня 2020

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

USERS и FEEDBACKS

Каждый пользователь имеет несколько отзывов, следовательно, от 1 до многих отношений между USERS и FEEDBACKS. Я использую Sequelize для моделирования. Я создал две модели следующего формата. ratedBy в FEEDBACKS указывает на id из USERS. Я также создал ассоциации между двумя таблицами.

const { sequelize } = require('../db_connection')

const Model = Sequelize.Model;

//Creating User model
class User extends Model { }
User.init({
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
    },
    name: {
        type: Sequelize.STRING,
        defaultValue: "",
        allowNull: false
    },
    email: {
        type: Sequelize.STRING,
        allowNull: false
    },
    avatar: {
        type: Sequelize.STRING,
        allowNull: false
    },
    createdAt: Sequelize.DATE,
    updatedAt: Sequelize.DATE,
}, { sequelize, modelName: 'user' })


//Creating Feedback model
class Feedback extends Model { }
Feedback.init({
    id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    comment: {
        type: Sequelize.STRING
    },
    rating: {
        type: Sequelize.INTEGER
    },
    ratedBy: {
        type: Sequelize.INTEGER,
        references: {
            model: User,
            key: 'id'
        }
    },
    createdAt: Sequelize.DATE,
    updatedAt: Sequelize.DATE,
}, { sequelize, modelName: 'feedback' })

User.associate = () => {
    User.hasMany(Feedback, { as: 'ratedBy' })
}

Feedback.associate = () => {
    Feedback.belongsTo(User, { foreignKey: 'ratedBy' });
}

Модели могут быть успешно перенесены. Когда я пытаюсь запустить запрос, чтобы вернуть все отзывы и пользователей из соответствующих таблиц, он просто выдает ошибку: Model 'feedback' is not associated with Model 'user'.

Я просмотрел разные ответы StackOverflow и пробовал разные ответы, но все напрасно .

const { User, Feedback } = require('./models')

//Migrate the User Model
User.sync({ alter: true })

//Migrate the Feedback Model
Feedback.sync({ alter: true })

const models = {
    User, Feedback
};

Object.keys(models).forEach(model => {
    console.log(models[model])
    if ('associate' in models[model]) {
        models[model].associate(models);
    }
})

1 Ответ

0 голосов
/ 21 июня 2020

Я пытался какое-то время и нашел решение. Мне просто нужно было внести небольшие изменения.

Я изменил ассоциации на это.

User.hasMany(Feedback, { foreignKey: 'ratedBy' })
Feedback.belongsTo(User, { foreignKey: 'ratedBy' });

Изменил мой запрос на это:

Feedback.findAll({
        attributes: ['comment', 'rating', 'createdAt', 'ratedBy'],
        include: [{
            model: User,
            as: 'user',
            attributes: ['name', 'avatar'],
        }]
    })
        .then(feedbacks => res.send(feedbacks))

Я также удалил ручные ассоциации для каждой модели.

const models = {
    User, Feedback
};

Object.keys(models).forEach(model => {
    console.log(models[model])
    if ('associate' in models[model]) {
        models[model].associate(models);
    }
})
...