问题描述
我有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()
问候,