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

时间:2017-12-14 20:26:45

标签: mysql node.js sequelize.js

我试图理解,sequelize是如何进行急切加载以及为什么它不适合我。

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

用户表:

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

项目表:

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 
}

项目模型(此关联完美运行):

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;
};

用户模型(这对我来说是棘手的部分):

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

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

  return User;
};

我的目标:

我想在itemController中获取包含用户的所有项目(可行),但我也想获取所有用户并在userController中包含所有相关项目(LEFT JOIN,对吧?)。渴望加载能够做到这一点(我是对的吗?)

想要输出:

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

UserController中

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

我在用户模型中尝试了以下内容:

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

正如我正确理解文档一样,“有很多人”。在这里使用是正确的。别名也很重要(&#39; insertedItems&#39;)。有没有什么,我错过了?

我正在使用sequelize 4.15.0和nodejs 9.2.0。

谢谢你们

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。

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

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