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

如何创建TypeORM实体并查询用户及好友关联数据?

TypeORM实现用户多对多好友关系及数据查询

已创建两张表:用户表、用户间多对多关系的好友关联表,需要创建对应的TypeORM实体,并查询出包含用户基本信息及关联好友列表的格式数据(示例格式见问题描述)


一、定义TypeORM实体

1. 用户实体(User)

import { Entity, PrimaryColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToMany, JoinTable } from "typeorm";

@Entity('user')
export class User {
  @PrimaryColumn()
  id: string;

  @Column()
  name: string;

  @Column()
  address: string;

  @CreateDateColumn({ name: 'created_time' })
  createdTime: Date;

  @UpdateDateColumn({ name: 'updated_time' })
  updatedTime: Date;

  // 直接关联好友用户,映射到自定义关联表
  @ManyToMany(() => User)
  @JoinTable({
    name: 'user_friend', // 关联表名称
    joinColumn: { name: 'user_id', referencedColumnName: 'id' },
    inverseJoinColumn: { name: 'friend_id', referencedColumnName: 'id' }
  })
  friends: User[];
}

2. 好友关联表实体(UserFriend)

如果关联表需要存储额外字段(比如好友添加时间、备注),可以定义该实体;若无需额外字段,仅靠上述User实体的@ManyToMany映射即可:

import { Entity, PrimaryColumn, ManyToOne, JoinColumn } from "typeorm";
import { User } from "./User";

@Entity('user_friend')
export class UserFriend {
  @PrimaryColumn({ name: 'user_id' })
  userId: string;

  @PrimaryColumn({ name: 'friend_id' })
  friendId: string;

  @ManyToOne(() => User)
  @JoinColumn({ name: 'user_id' })
  user: User;

  @ManyToOne(() => User)
  @JoinColumn({ name: 'friend_id' })
  friend: User;

  // 可选:添加关联表额外字段
  // @CreateDateColumn({ name: 'added_at' })
  // addedAt: Date;
}

二、查询用户及好友数据

方法1:使用FindOptions快速查询

直接通过内置find方法加载关联的好友列表:

import { getRepository } from "typeorm";
import { User } from "./entities/User";

async function getUsersWithFriends() {
  const userRepo = getRepository(User);
  // 查询所有用户并附带好友列表,可添加where条件过滤目标用户
  const users = await userRepo.find({
    relations: ['friends'],
    // where: { id: "1000014" }
  });

  return users;
}

方法2:使用QueryBuilder实现灵活查询

适合需要自定义返回字段、复杂过滤逻辑的场景:

async function getUsersWithFriendsQueryBuilder() {
  const userRepo = getRepository(User);
  const users = await userRepo
    .createQueryBuilder('user')
    .leftJoinAndSelect('user.friends', 'friend')
    // 可选:指定返回字段,精准匹配需求格式
    .select([
      'user.id',
      'user.name',
      'user.address',
      'user.createdTime',
      'user.updatedTime',
      'friend.id',
      'friend.name',
      'friend.address',
      'friend.createdTime',
      'friend.updatedTime'
    ])
    // 可选:添加过滤条件
    // .where('user.id = :id', { id: "1000014" })
    .getMany();

  return users;
}

说明

  • 上述查询返回的结果结构完全匹配需求示例,每个用户对象包含friends数组,数组内是好友的用户信息。
  • 若关联表存在额外业务字段,可通过UserFriend实体关联查询,再手动组装成需求格式。

内容的提问来源于stack exchange,提问作者boohaha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:20:42