Почему связывание belongsTo в Sequelize выдает мне эту ошибку?

#node.js #sequelize.js

#node.js #sequelize.js

Вопрос:

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

models/companies.js

 const DataTypes = require('sequelize');
const sequelize = require('../config/database');
const Users = require('./users');

const Companies = sequelize.define(
    'companies',
    {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        name: {
            type: DataTypes.STRING(50),
            unique: true,
            allowNull: false
        },
        image_url: {
            type: DataTypes.STRING(100),
            unique: true
        },
        created_at: {
            allowNull: true,
            type: DataTypes.DATE,
            defaultValue: Date.now()
        },
        updated_at: {
            allowNull: true,
            type: DataTypes.DATE,
            defaultValue: Date.now()
        }
    },
    {
        //Rewrite default behavior of sequelize
        timestamps: false,
        paranoid: true,
        underscored: true
    }
);

Companies.hasMany(Users);
Users.belongsTo(Companies);


Companies.sync();

module.exports = Companies;
 

models/users.js

 const DataTypes = require('sequelize');
const sequelize = require('../config/database');

const Users = sequelize.define(
    'users',
    {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: DataTypes.INTEGER
        },
        name: {
            type: DataTypes.STRING(40),
            allowNull: false
        },
        email: {
            type: DataTypes.STRING(60),
            allowNull: false,
            unique: true
        },
        password: {
            type: DataTypes.STRING(60)
        },
        role: {
            type: DataTypes.STRING(40),
            allowNull: false
        },
        image_url: {
            type: DataTypes.STRING(100),
            unique: true
        },
        batch: {
            type: DataTypes.STRING(3)
        },
        major: {
            type: DataTypes.STRING(10)
        },
        company_id: {
            type: DataTypes.INTEGER,
            allowNull: false
        },
        created_at: {
            allowNull: true,
            type: DataTypes.DATE,
            defaultValue: Date.now()
        },
        updated_at: {
            allowNull: true,
            type: DataTypes.DATE,
            defaultValue: Date.now()
        }
    },
    {
        //Rewrite default behavior of sequelize
        timestamps: false,
        paranoid: true,
        underscored: true
    }
);

Users.sync();

module.exports = Users;
 

Затем после того, как я попытаюсь запустить этот код ниже

 const Companies = require('./database/models/companies');
const Users = require('./database/models/Users');

//Relation 1: Company and Users
Companies.findAll({ include: [ Users ] }).then((res) => console.log(res));
Users.findAll({ include: [ Companies ] }).then((res) => console.log(res));
 

это дает мне эту ошибку:

 (node:4893) UnhandledPromiseRejectionWarning: SequelizeEagerLoadingError: companies is not associated to users!
 

Я попробовал несколько решений в Интернете, но в данном случае это не помогло.

Ответ №1:

BelongsTo означает взаимно однозначное отношение, в то время как у компании может быть несколько пользователей (имеется в виду вызов BelongsTo после hasMany столкновения!).

Подробнее: https://sequelize.org/master/manual/assocs.html

Комментарии:

1. Спасибо, при попытке решить вышеуказанную проблему я также наткнулся на эту статью, и, по-видимому, это не помогло. Я пытаюсь запустить этот код Users.findAll({ include: [ Companies ] }).then((res) => console.log(res)); и для этого мне кажется, что вы должны указать отношения между пользователями и компаниями со стороны пользователей

2. @IngVankhinh верно, имеет смысл, что a User будет иметь внешний ключ в Companies таблице

3. Спасибо за ваши усилия, чтобы помочь этому сообществу, брат