【问题标题】:Select desired columns only on eager loading Many-to-Many relation typeorm仅在急切加载多对多关系类型时选择所需的列
【发布时间】:2020-12-22 22:35:14
【问题描述】:

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

我该怎么做?

下面是我的两个实体。

旅行实体

@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" })
    }
  }

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

trip.buddies.forEach(buddy => {
        buddy.password = undefined
        buddy.updatedAt = undefined
        buddy.createdAt = undefined
        buddy.phonenumber = undefined
      })

【问题讨论】:

    标签: mysql node.js typeorm eager-loading


    【解决方案1】:

    我认为这可以解决问题

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

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

    问候,

    【讨论】:

    • 嗨@cristroyer,该项目已被放弃,但感谢您的回答,我希望有人觉得它有帮助 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2016-04-25
    • 2016-06-06
    • 2013-10-07
    相关资源
    最近更新 更多