如何向该关系中添加关注者?TypeORM与SQL数据库新手求助
嘿,作为TypeORM和SQL新手,别慌!添加关注者这个需求其实很常见,我结合最典型的「用户关注用户」场景给你一步步拆解,保证你能看懂~
第一步:先正确定义实体关系
首先得把用户和关注关系的实体定义好,因为TypeORM是基于实体来操作数据库的。这里我们用中间实体来维护关注关系(这种方式更灵活,后续能轻松加关注时间这类额外字段):
import { Entity, PrimaryGeneratedColumn, Column, OneToMany, ManyToOne, JoinColumn, Unique } from "typeorm"; // 用户实体 @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() username: string; // 我主动关注的用户列表 @OneToMany(() => Follow, follow => follow.follower) following: Follow[]; // 关注我的粉丝列表 @OneToMany(() => Follow, follow => follow.followed) followers: Follow[]; } // 关注关系中间实体 @Entity() export class Follow { @PrimaryGeneratedColumn() id: number; // 发起关注的用户(粉丝) @Unique(["follower", "followed"]) // 加联合唯一约束,防止重复关注 @ManyToOne(() => User, user => user.following) @JoinColumn({ name: "follower_id" }) follower: User; // 被关注的用户(博主) @ManyToOne(() => User, user => user.followers) @JoinColumn({ name: "followed_id" }) followed: User; }
小提示:如果你的场景完全不需要额外字段(比如关注时间),也可以直接用
@ManyToMany自关联,不用中间实体,但中间实体的扩展性更强,更推荐哦!
第二步:编写添加关注者的具体代码
接下来就是实现“用户A关注用户B”的逻辑了,代码很直观:
import { getRepository } from "typeorm"; import { User, Follow } from "./entities"; // followerId是发起关注的用户ID,followedId是被关注的用户ID async function followUser(followerId: number, followedId: number) { const userRepo = getRepository(User); const followRepo = getRepository(Follow); // 先确认两个用户都存在 const [follower, followed] = await Promise.all([ userRepo.findOne(followerId), userRepo.findOne(followedId) ]); if (!follower || !followed) { throw new Error("目标用户不存在哦"); } // 创建并保存关注关系 const newFollow = followRepo.create({ follower, followed }); try { await followRepo.save(newFollow); return "关注成功!"; } catch (err) { // 捕获唯一约束的错误,提示用户已关注 if (err.code === "ER_DUP_ENTRY") { return "你已经关注过这个用户啦"; } throw err; } }
第三步:一些必知的注意事项
- 同步数据库:写完实体后,记得让TypeORM帮你生成数据库表!开发环境可以在TypeORM配置里设
synchronize: true(生产环境绝对不能用这个!),或者跑命令typeorm schema:sync。 - 查询关联数据:如果之后要查某个用户的关注列表/粉丝列表,记得用
relations参数加载关联,比如userRepo.findOne(userId, { relations: ["following", "followers"] }),不然关联字段会是undefined。
内容的提问来源于stack exchange,提问作者HiImMardzin
相关产品推荐
相关产品推荐

