TypeORM:以一对多关系对记录进行计数

通过 TypeORM 与数据库通信时,会有很多情况需要以一对多的关系对记录进行计数,例如:

  • 您想列出用户和属于每个人的照片数量
  • 您想列出每个帖子的评论数量的帖子

使用强大的查询生成器,您只需几行代码即可完成。关键是查询方法loadRelationCountAndMap() 。它计算实体关系的实体数量并将值映射到某个实体的属性。或者,您可以添加条件和条件中使用的参数。这些话可能看起来很模糊。下面我们来看一个具体的例子。

在这个例子中,我们创建了 2 个表:userpost(对于一个最小的博客)。一个用户可以有很多帖子,但每个帖子只属于一个用户。

用户实体:

// KindaCode.com
// User entity
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Post } from './Post';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @OneToMany(type => Post, post => post.user)
  posts: Post[];
}

发布实体:

// KindaCode.com Example
// Post entity
import { Entity, Column, PrimaryGeneratedColumn, ManyToOne } from 'typeorm';
import { User } from './User';

@Entity()
export class Post {
    @PrimaryGeneratedColumn()
    id: number;

    @ManyToOne(type => User, user => user.posts)
    user: User;
    
    @Column()
    title: string;
    
    @Column()
    body: string;
}

以下是我们如何使用每个用户的帖子数检索所有用户:

const userRepository = myDataSource.getRepository(User);
const uwersWithPostCount = await userRepository
      .createQueryBuilder('user')
      .leftJoinAndSelect('user.posts', 'post')
      .loadRelationCountAndMap('user.postCount', 'user.posts') // count posts for each user
      .getMany();

console.log('Users with post count: ', uwersWithPostCount);

你会得到类似这样的输出:

Users with post count:  [
  User {
    id: 1,
    name: 'Hello Update',
    posts: [ [Post], [Post] ],
    postCount: 2
  },
  User { id: 2, name: 'Goodbye Update', posts: [], postCount: 0 }
]