仅在急切加载多对多关系类型时选择所需的列

问题描述

我有2个实体,用户和旅行与急切加载具有多对多关系。 当我加载行程时,我不希望返回所有用户详细信息,就像我不希望密码,创建和更新日期等,只是想要用户名和ID。

我该怎么做?

下面是我的两个实体。

旅行实体

    mut arr := []byte{len: size}
    ...
    nread := f.read_bytes_into(pos,arr) or {
        panic(err)
    }
    if nread == 0 {break}

用户实体

@Entity()
export class Trip {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  @IsNotEmpty()
  @Index({ unique: true })
  name: string

  @ManyToOne(type => User)
  @JoinColumn()
  owner: User

  @Column()
  @IsNotEmpty()
  destination: string

  @ManyToMany(type => User,{
    eager: true
  })
  @JoinTable()
  buddies: User[]
}

将其用作

@Entity()
export class User {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  @IsNotEmpty()
  @Index({ unique: true })
  username: string

  @Column()
  @IsNotEmpty()
  firstName: string

  @Column({ default: null })
  lastName: string

  @Column({ unique: true,default: null })
  @Length(10,12)
  phonenumber: string

  @Column()
  @Length(8,16)
  password: string

  @Column()
  @CreateDateColumn()
  createdAt: Date;

  @Column()
  @UpdateDateColumn()
  updatedAt: Date;

  @BeforeUpdate()
  @BeforeInsert()
  hashPassword() {
    if (this.password) {
      this.password = bcrypt.hashSync(this.password,8);
    }
  }

  checkIfUnencryptedPasswordisValid(unencryptedPassword: string) {
    return bcrypt.compareSync(unencryptedPassword,this.password);
  }
}

我可以通过以下更改获得所需的响应,但我对此不满意。

public doGetTripById = async (req: Request,res: Response) => {
    const tripId = req.params.tripId;

    const tripRepository = getRepository(Trip);
    let trip: Trip;

    try {
      trip = await tripRepository.findOneOrFail({ where: { id: tripId } });
      res.status(200).json(trip)
    } catch (error) {
      return res.status(400).json({ message: "Oops! somethig went haywire,possibly trip doesn't exist" })
    }
  }

解决方法

我认为这可以解决问题

您必须创建一个 QueryBuilder 对象并添加为外部表分配别名的关系,然后您才能选择所需的列。

tripRepository.createQueryBuilder("Trip")
  .innerJoinAndSelect("Trip.buddies","Buddie")
  .select(["Trip.id","Trip.name","Buddie.firstName","Buddie.lastName"])
  .where([...])
  .getMany()    

问候,