首页 > 解决方案 > Typeorm:如何按关系查询

问题描述

如何使用 Active Record 模式按关系查询?

我有 2 个实体,并希望通过查询第二个获得第一:

角色:

import { User } from "./User";

@Entity({ name: "roles" })
export class Role extends BaseEntity {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column()
  public name: string;

  @CreateDateColumn()
  public createdAt: string;

  @UpdateDateColumn()
  public updatedAt: string;

  @OneToMany(() => User, user => user.role)
  public users: User[];
}

用户:

@Entity({ name: "users" })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column()
  public email: string;

  @Column()
  public name?: string;

  @Column({ select: false })
  public passwordSalt: string;

  @Column({ select: false })
  public passwordHash: string;

  @CreateDateColumn()
  public createdAt: string;

  @UpdateDateColumn()
  public updatedAt: string;

  @Column()
  public roleId: number;

  @ManyToOne(() => Role, role => role.users, {
    eager: true
  })
  @JoinColumn()
  public role: Role;
}

我想查询用户Role.name并订购Role.createdAt,我编写buildQuery了为用户模型构建查询并将查询传递给的函数findAndCount

构建查询:

export default function buildQuery ({
  name,
  email,
  roleName,
  orderByRoleCreatedAt,
  limit,
  offset
}: IUsersQuery) {
  const query = {};

  if (name) {
    set(query, "where.name", Like(`${name}%`));
  }

  // how find users by user.role.name ???
  if (roleName) {
    set(query, "where.role.name", Like(`${roleName}%`));
  }

 // how order users by user.role.createdAt ASC ???
  if (orderByRoleCreatedAt) {
    set(query, "order.role.createdAt", orderByRoleCreatedAt);
  }

  if (email) {
    set(query, "where.email", Like(`${email}%`));
  }

  set(query, "skip", offset);
  set(query, "take", limit);

  return query;
}

User.findAndCount(buildQuery(params));

标签: javascriptnode.jstypescripttypeorm

解决方案


推荐阅读