我试图理解,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。
谢谢你们
答案 0 :(得分:0)
我自己找到了解决方案。
因为我有与多个用户关联的项目(insertUser,editUser),我需要指定正确的外键
User.hasMany(models.Item, {
as: 'items',
foreignKey: 'insertUserId'
});