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

如何通过MySQL和Node.js将分类表的分类名添加至子分类表?

解决方案:子分类表添加分类名称的两种实现方式

首先明确:你当前代码里用的include结合required: false,本质上就是执行了LEFT JOIN,已经能关联分类表获取名称。下面分两种场景给出具体实现:


场景1:仅查询时返回分类名称(不修改表结构)

如果不需要永久存储分类名称到子分类表,只是接口返回时带上,你可以优化现有代码,把分类名称从嵌套结构提取到子分类的顶层,让返回格式更直观:

修改admin.service.js的代码,在获取数据后处理结构:

try {
    const res = await this.db.sub_categories.findAll({
        where: { isDelete: false },
        include: [ 
            {
                model: this.db.categories, 
                attributes: ['category_name'], // 只取需要的分类名字段
                required: false // 对应LEFT JOIN,子分类即使没有父分类也会返回
            }
        ]
    });
    // 处理返回结构,把分类名称合并到子分类对象中
    return res.map(item => {
        const subCat = item.toJSON();
        return {
            ...subCat,
            category_name: subCat.category?.category_name || null // 处理分类不存在的情况
        };
    });
} catch (err) {
    throw err;
}

或者用Sequelize的raw: true直接写关联查询,更灵活:

try {
    const res = await this.db.sequelize.query(`
        SELECT sc.*, c.category_name
        FROM sub_categories sc
        LEFT JOIN categories c ON sc.category_id = c.id
        WHERE sc.isDelete = false
    `, { type: this.db.sequelize.QueryTypes.SELECT });
    return res;
} catch (err) {
    throw err;
}

场景2:永久将分类名称存入子分类表

如果需要把分类名称持久化到子分类表,需要分三步操作:

1. 修改子分类表结构

执行SQL添加字段:

ALTER TABLE sub_categories ADD COLUMN category_name VARCHAR(255) NULL;

如果用Sequelize迁移,创建迁移文件:

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.addColumn('sub_categories', 'category_name', {
      type: Sequelize.STRING,
      allowNull: true
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn('sub_categories', 'category_name');
  }
};

2. 同步现有数据

把已有的子分类对应的分类名称批量写入:

UPDATE sub_categories sc
LEFT JOIN categories c ON sc.category_id = c.id
SET sc.category_name = c.category_name
WHERE sc.isDelete = false;

3. 维护数据一致性

后续要保证分类名称修改时,子分类的名称也同步更新:

  • 方案一:用MySQL触发器,当分类表的category_name更新时,自动同步子分类表:
DELIMITER //
CREATE TRIGGER update_subcat_name AFTER UPDATE ON categories
FOR EACH ROW
BEGIN
  UPDATE sub_categories
  SET category_name = NEW.category_name
  WHERE category_id = NEW.id;
END //
DELIMITER ;
  • 方案二:在业务代码中,修改分类名称时,同时更新关联的子分类:
// 修改分类名称的业务逻辑示例
async updateCategoryName(categoryId, newName) {
    await this.db.sequelize.transaction(async (t) => {
        // 更新分类表
        await this.db.categories.update(
            { category_name: newName },
            { where: { id: categoryId }, transaction: t }
        );
        // 同步更新子分类表
        await this.db.sub_categories.update(
            { category_name: newName },
            { where: { category_id: categoryId }, transaction: t }
        );
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:32:53