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

Sequelize是否支持自引用表?如何配置表内父子关联?

Sequelize 自引用表配置方案

Sequelize完全支持自引用表的配置,你描述的这种product表通过parent_id字段建立自身父子关联的结构是完全可行的。以下是具体的配置步骤:

1. 定义Product模型

首先在模型中定义parent_id字段,将其设置为外键关联到自身表的id字段:

const { Model, DataTypes } = require('sequelize');
const sequelize = require('../your-sequelize-instance'); // 替换为你的Sequelize实例

class Product extends Model {}

Product.init({
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  parent_id: {
    type: DataTypes.INTEGER,
    references: {
      model: 'products', // 关联的数据库表名
      key: 'id'
    },
    onDelete: 'SET NULL', // 可选:父记录删除时,子记录parent_id设为null
    onUpdate: 'CASCADE' // 可选:父记录id更新时,子记录parent_id同步更新
  }
}, {
  sequelize,
  modelName: 'Product',
  tableName: 'products' // 数据库表名,需与references中的model一致
});

2. 设置自引用关联

由于是自引用,必须通过as别名区分父级和子级关联:

// 关联:一个Product属于另一个Product(父级)
Product.belongsTo(Product, { 
  as: 'Parent', // 查询时用来识别父级的别名
  foreignKey: 'parent_id'
});

// 关联:一个Product可以有多个子Product
Product.hasMany(Product, {
  as: 'Children', // 查询时用来识别子级的别名
  foreignKey: 'parent_id'
});

3. 查询示例

配置完成后,可通过include选项查询包含父级或子级的记录:

  • 查询单个产品及其父级:
const productWithParent = await Product.findByPk(1, {
  include: [{ model: Product, as: 'Parent' }]
});
  • 查询单个产品及其所有子级:
const productWithChildren = await Product.findByPk(1, {
  include: [{ model: Product, as: 'Children' }]
});
  • 递归查询多层级子节点(按需嵌套include):
const recursiveProduct = await Product.findByPk(1, {
  include: [{
    model: Product,
    as: 'Children',
    include: [{ model: Product, as: 'Children' }] // 可继续嵌套更多层级
  }]
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:19:54