如何在 TypeORM 中为实体添加嵌套对象数组字段

冬萱大大_6320

冬萱大大_6320

2026-02-04

178人浏览

原创

如何在 TypeORM 中为实体添加嵌套对象数组字段

本文介绍在 typeorm 中为实体高效存储嵌套对象数组(如图标列表)的两种主流方案:使用 jsonb 字段直接序列化,或通过一对多关系建模;重点演示 jsonb 方式,兼顾类型安全与开发简洁性。

在实际业务中,常需将结构化但非强关联的数据(如 icons 数组)作为字段嵌入主实体,而非单独建表。TypeORM 提供了灵活支持——推荐优先采用 jsonb 类型(PostgreSQL)或 json 类型(MySQL/SQLite)直接存储对象数组,既保持数据内聚性,又避免过度规范化带来的复杂 JOIN 查询。

✅ 推荐方案:使用 @Column({ type: 'jsonb' })(PostgreSQL)

// icons.interface.ts
export interface Icon {
  icon: string;
  main: boolean;
}

// category.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class Category {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  // ✅ 存储 Icon[] 数组,自动序列化/反序列化
  @Column({ type: 'jsonb', nullable: true, default: () => '[]' })
  icons: Icon[];
}
⚠️ 注意:default: [] 在 TypeScript 中会被忽略(因装饰器无法运行时计算),应改用 default: () => '[]' 确保数据库默认值生效。MySQL 用户请替换为 { type: 'json', default: () => '[]' }。

? 使用示例

// 创建带图标的数据
const category = new Category();
category.title = 'Title text';
category.icons = [
  { icon: 'icon-1.png', main: true },
  { icon: 'icon-2.png', main: false },
  { icon: 'icon-3.png', main: false }
];

await repository.save(category);

查询时,icons 字段将自动解析为 Icon[] 类型数组,可直接遍历或解构:

const loaded = await repository.findOneBy({ id: 1 });
console.log(loaded.icons[0].icon); // "icon-1.png"

? 替代方案:关系型建模(适用需独立查询/索引/约束场景)

若需对 icon 单独建立索引、关联其他表,或频繁按 main = true 查询,则建议拆分为独立实体:

Expanso json-flatten
Expanso json-flatten

通过 CLI 或 MCP 服务器,使用 Expanso Edge 管道扁平化嵌套 JSON 对象。

下载
@Entity()
export class Icon {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  icon: string;

  @Column({ default: false })
  main: boolean;

  @ManyToOne(() => Category, category => category.icons)
  category: Category;
}

@Entity()
export class Category {
  // ... 其他字段
  @OneToMany(() => Icon, icon => icon.category, { cascade: true })
  icons: Icon[];
}

此时需手动管理关联,增删更复杂,但灵活性与数据库能力更强。

✅ 总结建议

  • 轻量嵌套、读多写少、无复杂查询需求 → 选 jsonb/json 字段:开发快、结构清晰、TypeScript 类型友好;
  • 需独立 CRUD、事务一致性、外键约束或高频条件筛选 → 选关系实体;
  • 始终为 jsonb 字段添加 nullable: true 和显式 default,避免 NULL 值引发运行时错误;
  • 在 NestJS 等框架中,可配合 ValidationPipe 对 icons 字段做 DTO 层校验,进一步保障数据质量。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql js json typescript cad

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

2026.02.13

312

17

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

2026.02.25

520

17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

2026.03.13

391

19

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

2026.06.03

306

29

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

2026.06.16

678

8

mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2413

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1459

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

855

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3412

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习