我试图理解,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 回答
我自己找到了解决方案 .
因为我有与多个用户关联的项目(insertUser,editUser),我需要指定正确的外键