如何在Sequelize-Typescript中关联同表获取父ID数据?
同表自关联查询:Sequelize-Typescript获取父级数据问题解决
你在使用Sequelize-Typescript装饰器实现同表自关联时,发现查询结果中parent_element字段被忽略,无法获取父ID对应的关联数据。
你的Element模型代码如下:
@Table({ timestamps:false, tableName: "element" }); export class Element extends Model { @Column({ type: DataType.INTEGER, primaryKey:true, allowNull:false, autoIncrement:true }) id!:number; @Column({ type: DataType.STRING, allowNull:false, }) name!:string; @ForeignKey(() => Element) @Column({ type: DataType.INTEGER, allowNull:false, }) parent_id!:number; @BelongsTo(() => Element) parent_element!: Element; }
期望返回结果:
"element": [ { "id": 1, "name": "Car", "parent_id": null, "parent_element": {} }, { "id": 2, "name": "Engine", "parent_id": 1, "parent_element": { "id": 1, "name": "Car", "parent_id": null } } ]
实际返回结果:
"element": [ { "id": 1, "name": "Car", "parent_id": null }, { "id": 2, "name": "Engine", "parent_id": 1 } ]
解决步骤
1. 修正模型的关联配置
自关联场景下,必须给BelongsTo关联指定别名,同时修正parent_id的可空配置(根节点的父ID为null):
修改后的模型代码:
@Table({ timestamps: false, tableName: "element" }) export class Element extends Model { @Column({ type: DataType.INTEGER, primaryKey: true, allowNull: false, autoIncrement: true }) id!: number; @Column({ type: DataType.STRING, allowNull: false, }) name!: string; @ForeignKey(() => Element) @Column({ type: DataType.INTEGER, allowNull: true, // 允许父ID为null,适配根节点场景 }) parent_id!: number | null; // 类型同步改为可空 @BelongsTo(() => Element, { as: 'parent_element', // 指定关联别名,需和字段名保持一致 foreignKey: 'parent_id' // 显式绑定外键字段 }) parent_element!: Element | null; // 根节点的parent_element设为null }
2. 查询时显式包含关联数据
Sequelize默认不会自动加载关联数据,必须在findAll中通过include选项指定要加载的关联:
const elements = await Element.findAll({ include: [ { model: Element, as: 'parent_element', // 必须和模型中BelongsTo的别名完全匹配 attributes: ['id', 'name', 'parent_id'] // 可选:指定返回的父级字段,避免冗余数据 } ] }); // 转换为目标JSON格式 const result = { element: elements.map(el => el.toJSON()) }; console.log(result);
3. 可选:处理多级关联(如需)
如果需要支持多级父级查询(比如获取父级的父级),可以在include中嵌套配置,但如果只需要一级父级数据,上述配置已完全满足需求。
内容的提问来源于stack exchange,提问作者Felipe Antonio Guzmán Anabalon
相关产品推荐
相关产品推荐

