如何在Sequelize的Loan.findAll中关联查询三个用户外键数据?
解决Sequelize中Loan关联多个User的查询问题
因为你有三个指向User表的外键,必须通过别名区分不同关联,才能让Sequelize正确返回三个外键对应的用户数据,具体操作如下:
1. 完善Loan模型的关联配置
在Loan模型的associate方法中,给每个belongsTo关联设置唯一别名,明确对应外键:
Loan.associate = function(models) { // 关联借款用户(对应user_id) Loan.belongsTo(models.User, { as: 'borrower', foreignKey: 'user_id' }); // 关联第一担保人(对应guarantor_one_id) Loan.belongsTo(models.User, { as: 'guarantorOne', foreignKey: 'guarantor_one_id' }); // 关联第二担保人(对应guarantor_two_id) Loan.belongsTo(models.User, { as: 'guarantorTwo', foreignKey: 'guarantor_two_id' }); };
2. 查询时指定所有带别名的关联
查询时不能仅传入model: User,需要在include数组中逐个声明每个关联的别名,让Sequelize分别查询三个外键对应的User数据:
// 注意使用await处理异步查询,或通过.then()处理Promise const loans = await Loan.findAll({ where: { user_id: userId }, include: [ { model: User, as: 'borrower' }, { model: User, as: 'guarantorOne' }, { model: User, as: 'guarantorTwo' } ] });
3. 可选:自定义返回字段
如果不需要User表的全部属性,可以给每个关联添加attributes选项指定返回字段:
const loans = await Loan.findAll({ where: { user_id: userId }, include: [ { model: User, as: 'borrower', attributes: ['id', 'username', 'phone'] }, { model: User, as: 'guarantorOne', attributes: ['id', 'username', 'email'] }, { model: User, as: 'guarantorTwo', attributes: ['id', 'username', 'address'] } ] });
查询结果中,每个loan对象会包含borrower、guarantorOne、guarantorTwo三个属性,分别对应三个外键关联的完整User数据。
内容的提问来源于stack exchange,提问作者John Adeniran
相关产品推荐
相关产品推荐

