如何创建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
相关产品推荐
相关产品推荐

