Ассоциированный в Sequelize не работает, как задумано - PullRequest
1 голос
/ 23 июня 2019

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

У меня есть две таблицы: Пользователь и Элемент.

Пользователь (user.js)

const User = dbconnection.sequelize.define('users', {
    id:  { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true},
    name: {
        type:  Sequelize.STRING(80),
        allowNull: false
    },
    email: {
        type:  Sequelize.STRING(120),
        allowNull: false,
        unique: true
    },
    dob: {
        type: Sequelize.DATEONLY,
        allowNull: false
    },
    password: {
        type:  Sequelize.STRING(256),
        allowNull: false
    }

});

User.associate = models => {
    User.hasMany(models.Item, { as: 'items',foreignKey: 'user_id' })
}

dbconnection.sequelize.sync({ force: false })
    .then(() => {
        //console.log('Table created!')
    });

module.exports = {
    User
};

Item (item.js)

const Item = dbconnection.sequelize.define('items', {
    id:  { type: Sequelize.INTEGER, unique: true, autoIncrement: true, primaryKey: true},
    item: {
        type: Sequelize.STRING(80),
        allowNull: true
    },
    item_type: {
        type: Sequelize.STRING(10),
        allowNull: false
    },
    comment: {
        type: Sequelize.STRING(1000),
        allowNull: true
    },
    user_id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: { model: 'users', key: 'id' }
    },
});

Item.associate = models => {
    Item.belongsTo(models.User, { as: 'users',foreignKey: 'user_id' })
}

dbconnection.sequelize.sync({ force: false })
    .then(() => {
        // console.log('Table created!')
    })
});

module.exports = {
    Item
};

У пользователя hasMany (Элемент), а Item принадлежит To (Пользователь), как показано выше.

Однако, когда я делаю запрос к таблице Item (как показано ниже),

const usersdb = require('./userdb')
const itemsdb = require('./itemdb')

class ItemsController {
    static async getAllItems(req, res, next) {
        try{
            let allitems = await itemsdb.Item.findAll({
                include: [{
                    model: usersdb.User
                }]
            })
            return {items: allitems, status: true}
        }
        catch (e) {
            return {items: e, status: false}
        }
    }
}

module.exports = ItemsController;

Я получаю SequelizeEagerLoadingError, что «пользователи не связаны с элементами!»

Я перепробовал все доступные исправления, включая this и this , но безуспешно.

1 Ответ

0 голосов
/ 25 июня 2019

Я наконец нашел обходной путь. Сначала я отбросил таблицы и отбросил определения моделей. Во-вторых, я генерировал миграции и модели, используя команду sequelize model:create --name ModelName --attributes columnName:columnType. Затем я использовал сгенерированные модели, чтобы связать две таблицы, как я это делал ранее. Наконец, я запустил команду sequelize db:migrate для создания таблиц, и при выполнении запроса это сработало!

Ранее я создавал модели вручную. Я также создавал таблицы с помощью команды sequelize.sync({force: false/true}) после загрузки моделей.

Модель пользователя (user.js)

'use strict';
module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    email: {
        type:  DataTypes(120),
        allowNull: false,
        unique: true
    },
    dob: {
        type: DataTypes.DATEONLY,
        allowNull: false
    },
    password: {
        type:  DataTypes.STRING(256),
        allowNull: false
    }
  }, {});
  User.associate = function(models) {
    User.hasMany(models.Item, {as: 'Item', foreignKey: 'user_id'})
  };
  return User;
};

Модель товара (item.js)

'use strict';
module.exports = (sequelize, DataTypes) => {
  const Item = sequelize.define('Item', {
    item: {
      type: DataTypes.STRING(80),
      allowNull: true
    },
    item_type: {
      type: DataTypes.STRING(10),
      allowNull: false
    },
    comment: {
      type: DataTypes.STRING(1000),
      allowNull: true
    },
    user_id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      references: { model: 'User', key: 'id' }
    }
  }, {});
  Item.associate = function(models) {
    Item.belongsTo(models.User, { as: 'User',foreignKey: 'user_id' })
  };
  return Item;
};

Запрос (queryitem.js)

const Item = require('../models').Item
const User = require('../models').User

class ItemsController {
    static async getAllItems() {
        try{
            let allitems = await Item.findAll({
                include: [{
                    model: User,
                    as: 'User'
                }]
            })
            return {items: allitems, status: true}
        }
        catch (e) {
            return {items: e, status: false}
        }
    }
}

module.exports = ItemsController;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...