TypeORM:按关系字段对结果进行排序

使用 TypeORM 与数据库交互时,有时您可能希望获取记录并根据关系字段对它们进行排序。有两种解决方案:使用查找选项和使用查询构建器。让我们看下面的例子更清楚。

这个例子

在此示例中,我们有 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;

  @Column({nullable: true})
  age: number;

  @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, { cascade: true })
  user: User;

  @Column()
  title: string;

  @Column()
  body: string;
}

使用查找选项

这种方法适用于TypeORM 0.3和更新版本。对于旧版本,请考虑改用查询生成器

使用下面的代码片段,年轻用户的帖子将首先出现:

const postRepository = myDataSource.getRepository(Post);

const posts = await postRepository.find({
      relations: {
        user: true,
      },
      order: {
        user: {
          age: 'ASC',
        },
      },
});

console.log(posts);

使用查询生成器

这段代码的作用与前面的代码片段一样:

const postRepository = myDataSource.getRepository(Post);

const posts = await postRepository
      .createQueryBuilder('post')
      .leftJoinAndSelect('post.user', 'user')
      .orderBy('user.age', 'ASC')
      .getMany();

console.log(posts);

结论

我们已经介绍了几种不同的方法来按关系列的顺序从数据库中获取数据。当您必须处理具有表之间关系的复杂数据库时,这些知识很有帮助。如果您想了解更多关于 TypeORM 和其他后端技术的新奇有趣的东西,请查看更多文章。