如何在TypeORM实体中添加包含对象的icons数组字段?
在TypeORM实体中实现包含对象的icons数组
针对你的需求,有两种常见方案可以实现对应的icons字段,具体选哪种看你的业务场景:
方案1:直接使用JSON类型字段(简单快捷)
如果不需要单独对每个icon做增删改查,只是作为主实体的附属数据存储,直接用JSON类型字段最方便。
首先定义icons元素的类型(可选,TypeScript下能获得更好的类型提示):
interface IconItem { icon: string; main: boolean; }
然后在现有实体中添加对应的字段:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"; interface IconItem { icon: string; main: boolean; } @Entity() export class YourEntity { @PrimaryGeneratedColumn() id: number; @Column() title: string; // 添加icons字段,指定类型为json @Column('json') icons: IconItem[]; }
存储后数据库内的icons字段会以JSON数组形式保存,和你给出的目标结构完全匹配。
方案2:创建关联实体(适合复杂业务场景)
如果需要单独操作每个icon(比如修改某个icon的main状态、单独删除某个icon),更推荐用TypeORM的OneToMany关联关系,把icons拆成独立实体。
步骤1:创建Icon实体
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm"; import { YourEntity } from "./YourEntity"; @Entity() export class Icon { @PrimaryGeneratedColumn() id: number; @Column() icon: string; @Column({ type: 'boolean' }) main: boolean; // 关联到主实体,自动生成外键 @ManyToOne(() => YourEntity, (yourEntity) => yourEntity.icons) parent: YourEntity; }
步骤2:在主实体中添加OneToMany关联
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"; import { Icon } from "./Icon"; @Entity() export class YourEntity { @PrimaryGeneratedColumn() id: number; @Column() title: string; // 关联Icon实体,设置cascade实现联动保存/删除 @OneToMany(() => Icon, (icon) => icon.parent, { cascade: true }) icons: Icon[]; }
这种方式下,你可以通过TypeORM的关联查询获取icons列表,也能单独对某个Icon实体执行增删改查操作。
两种方案对比
- 方案1:开发速度快,数据存储紧凑,适合简单附属数据场景,但无法单独操作数组内的单个元素。
- 方案2:符合ORM实体设计规范,支持单独操作每个icon,适合业务逻辑复杂的场景,但需要额外维护关联实体。
内容的提问来源于stack exchange,提问作者Spawnet
相关产品推荐
相关产品推荐

