首页 文章

在Sequelize中了解渴望加载的关联问题

提问于
浏览
0

我试图理解,sequelize如何做急切的加载以及为什么它不适合我 .

请假设,我通过sequelize migrate命令创建以下表:

Users table:

return queryInterface.createTable('Users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      .... other columns
}

Items table:

return queryInterface.createTable('Items', {
        id: {
            allowNull: false,
            autoIncrement: true,
            primaryKey: true,
            type: Sequelize.INTEGER
        }, 
        insertUserId: {
            allowNull: false,
            type: Sequelize.INTEGER,
            onDelete: 'CASCADE',
            onUpdate: 'CASCADE',
            references: {
                model: 'Users',
                key: 'id',
                as: 'insertUserId'
            }
        },
        ..... some other columns 
}

Items model (this association works perfectly):

module.exports = (sequelize, DataTypes) => {
  const Item = sequelize.define('Item', {
  .... configuration of columns
  });

  Item.associate = (models) => {
   Item.belongsTo(models.User, {
    as: 'insertUser'
   });
  };

  Item.associate = (models) => {
    Item.belongsTo(models.User, {
      as: 'editUser'
  });

  return Item;
};

Users model (that's the tricky part for me):

module.exports = (sequelize, DataTypes) => {
  const User = sequelize.define('User', {
    .... configuration of columns
  });

  User.associate = (models) => {
        - TRICKY ASSOCIATION - 
  };

  return User;
};

My goal:

我想在itemController中获取包含用户的所有项目(可以正常工作),但我也希望获得所有用户并在userController中包含所有相关项目(LEFT JOIN,对吧?) . 渴望装载能够做到这一点(我是对的吗?)

wanted output:

{ 
 id: '0',
 name: 'username', 
 insertedItems: [
  { <item_1> },
  { <item_n> }
 ]
}

userController

function getUsersItems(year) {
    return User.findAll({
        include: [{
            model: Item,
            as: 'insertedItems'
        }],
        attributes: ['id', 'name']
    });
}

I tried the following in the user model:

User.associate = (models) => {
    User.hasMany(models.Item, {
        as: 'insertedItems',
        foreignKey: 'id'
    });
};

正如我对文档的正确理解,'hasMany'在这里使用是正确的 . 别名也很重要('insertedItems') . 有没有什么,我错过了?

我使用sequelize 4.15.0和nodejs 9.2.0 .

感谢你们

1 回答

  • 0

    我自己找到了解决方案 .

    因为我有与多个用户关联的项目(insertUser,editUser),我需要指定正确的外键

    User.hasMany(models.Item, {
        as: 'items',
        foreignKey: 'insertUserId'
    });
    

相关问题