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
相关产品推荐
相关产品推荐

