You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向该关系中添加关注者?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:04:09