Sequelize自关联多对多查询报错SequelizeEagerLoadingError: User is not associated to User
问题原因
你遇到的报错是三个核心问题共同导致的:关联配置缺失必要参数、拼写错误、模型导入方式错误。以下是逐点修复方案:
1. 修复User模型关联配置
自关联多对多关系必须同时指定foreignKey(当前模型在中间表的外键字段)和otherKey(关联目标模型在中间表的外键字段),同时修正你之前的别名拼写错误:
User.associate = function (models) { // 当前用户作为好友请求发送方,关联的接收方用户 User.belongsToMany(models.User, { as: 'ReceivedFriends', foreignKey: 'senderUUID', otherKey: 'receiverUUID', through: "Friendship" }); // 当前用户作为好友请求接收方,关联的发送方用户 User.belongsToMany(models.User, { as: 'SentFriends', foreignKey: 'receiverUUID', otherKey: 'senderUUID', through: "Friendship" }); }
别名可以根据你的业务逻辑自定义,只要查询时的as参数和这里保持一致即可。
2. 修复Friendship迁移文件
中间表外键字段类型需要和User表主键类型保持一致,删除不必要的as配置:
senderUUID: { type: Sequelize.UUID, // 原来的TEXT改为UUID,和User表的userUUID类型匹配 references: { model: 'User', key: 'userUUID' }, allowNull: false }, receiverUUID: { type: Sequelize.UUID, // 原来的TEXT改为UUID references: { model: 'User', key: 'userUUID' }, allowNull: false },
修改完后重新执行迁移,确保表结构生效。
3. 修复Controller的模型导入和查询逻辑
必须从模型入口文件导入User实例,直接导入单个User模型文件得到的是未执行关联逻辑的模型实例,自然会报关联不存在的错误:
// 错误写法示例:const User = require('../models/User.js') // 正确写法,指向你的models/index.js路径 const { User } = require('../models');
查询时的as参数要和关联配置里的别名完全匹配:
const getFriends = async (req, res) => { const userUUID = req.params.userUUID try { const user = await User.findOne({ where: { userUUID }, include: [{ model: User, as: 'SentFriends', // 和关联配置里的别名对应 attributes: ['username'], through: { attributes: [] } }], }); return res.json(user); } catch (err) { console.log(err); return res.status(500).json({ error: "Could not get friends - " + err }); } };
如果需要查询当前用户所有双向关联的好友,同时include两个别名的关联即可。
内容的提问来源于stack exchange,提问作者Joseph Lillard
相关产品推荐
相关产品推荐

