我正在尝试急切加载 belongs-to-many
关联,我正在加载三个嵌套关联。这是模型,它们产生三个数据库表 programs
、 programDates
和 peopleProgramDates
program.js
:
module.exports = function(sequelize, DataTypes) {
const Program = sequelize.define('program', {
name: DataTypes.STRING
});
Program.associate = ({programDate}) => {
Program.hasMany(programDate);
};
return Program;
};
program_date.js
:module.exports = function(sequelize, DataTypes) {
const ProgramDate = sequelize.define('programDate', {
date: DataTypes.DATEONLY,
volunteerLimit: DataTypes.INTEGER
}, {
indexes: [
{
unique: true,
fields: ['programId', 'date']
}
]
});
ProgramDate.associate = ({program, person}) => {
ProgramDate.belongsTo(program);
ProgramDate.belongsToMany(person, {through: 'peopleProgramDates'});
};
return ProgramDate;
};
在我的 Controller 中,我想返回一个包含所有程序、programDates 和 peopleProgramDates 的对象:
const {bus, family, person, volunteerType, program, programDate} = require('../models');
exports.get = (request, response) => {
return Promise.all([
bus.findAll({ include: [{model: family, include: [person]}] })
.then(buses => buses.map(addBusCount)),
volunteerType.findAll({include: [person]})
.then(volunteerTypes => volunteerTypes.map(addVolunteerCount)),
// this query hangs the application
program.findAll( { include: [{ model: programDate, include: [{association: 'peopleProgramDates'}] }]} )
.then(programs => programs.map(processPrograms))
])
.then(([buses, volunteerTypes, programs]) =>
response.render('pages/register', {
buses,
volunteerTypes,
programs
})
);
};
目前,
processPrograms()
是一个简单地返回相同对象数组的函数,因此不应与此处相关。 addBusCount
和 addVolunteerCount
同样不相关。我认为问题可能是 peopleProgram 日期不是真正的 Sequelize 模型,而是
belongsToMany through:
上的 ProgramDate
关联的结果。This post 似乎建议我可以使用
association:
属性来从 through
关联加载数据,但是查询会挂起应用程序。如果我从查询中删除连接表,则数据加载正常:
program.findAll( { include: [programDate] } )
加分项:最终我真正需要的只是
peopleProgramDates
对象返回的 programDate
计数。也许我可以简单地在 programDates
模型上定义这样的东西,但是也许我们可以在一个单独的问题中解决这个问题。尽管如此,如果有一个令人信服的理由使用这种方法,例如性能,那么也许我们终究应该采用这种方式。
最佳答案
解决办法是通过关联给belongsToMany
添加一个别名:
// program_date.js
ProgramDate.belongsToMany(person, {through: 'peopleProgramDates', as: 'peopleProgDates'});
然后在
include
属性中引用别名:program.findAll( { include: [{ model: programDate, include: [{association: 'peopleProgDates'}] }]} )
关于javascript - 表达和 Sequelize : eager loading belongs to many associations hangs application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48046482/