TypeORM技术问题:如何将gold、exp存入用户关联的Inventory实体?
解决TypeORM中创建User时同步关联Inventory的问题
好的,我来一步步帮你搞定这个需求。要把gold和exp存入关联的Inventory实体,你需要先完成实体关联的定义,再调整创建逻辑,具体操作如下:
1. 定义Inventory实体并建立与User的关联
首先你得先创建Inventory实体,并且和User建立一对一的关联(毕竟每个用户对应一个背包是合理的设计)。这里我们用双向关联,方便后续双向查询操作:
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from "typeorm"; import { User } from "./User"; @Entity() export class Inventory { @PrimaryGeneratedColumn() id!: number; @Column({ type: 'int', default: 0 }) // 用数字类型更贴合数值场景,设置默认值0更合理 gold!: number; @Column({ type: 'int', default: 0 }) exp!: number; // 与User建立一对一关联,@JoinColumn表示这一方持有外键字段 @OneToOne(() => User, user => user.inventory) @JoinColumn() user!: User; }
2. 修改User实体添加Inventory关联
接下来要在你的User实体里添加对应的关联字段,让两者形成双向绑定:
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from "typeorm"; import { Inventory } from "./Inventory"; @Entity() export class User { @PrimaryGeneratedColumn() id!: number; @Column() name!: string; // 反向关联Inventory,注意这里不需要加@JoinColumn @OneToOne(() => Inventory, inventory => inventory.user, { cascade: true // 关键配置!开启级联操作后,保存User时会自动同步保存关联的Inventory }) inventory!: Inventory; }
这里的cascade: true是核心,它能让TypeORM在保存/更新User时,自动处理关联Inventory的保存/更新,不用手动操作两次。
3. 创建User时同步创建Inventory
现在你就可以在创建User的同时,把gold和exp存入对应的Inventory了。注意要把传入的字符串类型数值转成数字类型:
import { getRepository } from "typeorm"; import { User } from "./User"; import { Inventory } from "./Inventory"; // 示例创建逻辑 async function createUser(userData: { name: string; gold: string; exp: string }) { const userRepo = getRepository(User); const inventoryRepo = getRepository(Inventory); // 1. 创建Inventory实例,转换数据类型 const inventory = inventoryRepo.create({ gold: Number(userData.gold), exp: Number(userData.exp) }); // 2. 创建User实例并关联Inventory const user = userRepo.create({ name: userData.name, inventory: inventory }); // 3. 保存User,因为开启了级联,Inventory会被自动同步保存 return await userRepo.save(user); } // 调用示例 createUser({ name: "Kahvi", gold: "200", exp: "500" }) .then(savedUser => console.log("创建成功:", savedUser)) .catch(err => console.error("创建失败:", err));
如果你不想依赖级联,也可以手动先保存Inventory,再保存User:
async function createUserWithoutCascade(userData: { name: string; gold: string; exp: string }) { const userRepo = getRepository(User); const inventoryRepo = getRepository(Inventory); const inventory = inventoryRepo.create({ gold: Number(userData.gold), exp: Number(userData.exp) }); // 先手动保存Inventory await inventoryRepo.save(inventory); const user = userRepo.create({ name: userData.name, inventory: inventory }); return await userRepo.save(user); }
这样操作后,数据库里会同时生成一条User记录和一条关联的Inventory记录,gold和exp也会正确存储在Inventory表里啦。
内容的提问来源于stack exchange,提问作者CantV
相关产品推荐
相关产品推荐

