You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sequelize中表同时关联同表belongsTo和belongsToMany时findAll用法

问题原因

你当前的查询只关联了一次User模型,由于Item和User存在两类不同的关联,Sequelize默认只会匹配第一个定义的belongsTo创建者关联,因此不会返回点赞用户列表。

解决步骤

1. 给关联配置添加别名区分

首先需要修改关联定义,通过as参数给两类不同的User关联设置唯一别名,让Sequelize可以区分不同的关联关系:

// User表关联修改
db.User.hasMany(db.Item, { foreignKey: 'userIdx', sourceKey: 'userIdx', as: 'createdItems' });
db.User.belongsToMany(db.Item, { through: 'Like', foreignKey: 'userIdx', as: 'likedItems' });

// Item表关联修改
db.Item.belongsTo(db.User, { 
  foreignKey: 'userIdx', 
  targetKey: 'userIdx', 
  as: 'creator' // 创建者关联别名
});
db.Item.belongsToMany(db.User, { 
  through: 'Like', 
  foreignKey: 'itemIdx', 
  as: 'likeStateUsers' // 点赞用户关联别名,和你需要的返回字段名保持一致
});

Like表的原有关联配置无需修改。

2. 调整查询语句同时关联两类数据

查询时在include数组中分别引入两个不同别名的关联即可:

const result = await Item.findAll({
    include: [
        // 关联获取Item创建者信息
        {
            model: User,
            as: 'creator',
            // 可选:指定只返回需要的创建者字段,避免冗余
            attributes: ['userIdx', 'nickname', 'avatar']
        },
        // 关联获取点赞该Item的用户列表
        {
            model: User,
            as: 'likeStateUsers',
            // 可选:过滤掉中间表Like的冗余返回字段
            through: { attributes: [] },
            // 可选:指定只返回需要的点赞用户字段
            attributes: ['userIdx', 'nickname']
        }
    ],  
})

执行后返回的每个Item对象就会自带creator创建者信息和likeStateUsers点赞用户数组,和你需要的结构完全匹配。

内容的提问来源于stack exchange,提问作者DongDong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:36:03