如何通过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
相关产品推荐
相关产品推荐

