【发布时间】:2020-01-08 17:18:06
【问题描述】:
我正在使用带有 TypeORM 的 NestJS
我有两个有关系的实体:
export class Device {
@PrimaryGeneratedColumn()
id: number;
@Column("macaddr")
mac: string;
@OneToMany(type => DeviceStatus, deviceStatus => deviceStatus.mac)
@JoinColumn()
status: DeviceStatus[]
@Column()
created: Date;
}
export class DeviceStatus {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(type => Device, device => device.mac)
@JoinColumn({ name: "mac", referencedColumnName: "mac" })
mac: Device;
@Column()
deviceState: number;
@Column()
created: Date;
}
我想获取设备,但只有它的status 属性上的最新设备状态。
现在我是这样做的:
const deviceQuery: Device = await this.deviceRepository
.createQueryBuilder("device")
.where('device.id = :id AND "device"."userId" = :user', {id: id, user: user.id})
.getOne();
const statusQuery: DeviceStatus = await this.deviceStatusRepository.createQueryBuilder("status")
.where('status.mac = :mac', { mac: deviceQuery.mac })
.orderBy('created', "DESC")
.limit(1)
.getOne();
deviceQuery.status = [statusQuery];
如何仅使用一个 typeorm queryBuilder 查询来做到这一点?
我已经尝试过了,但它不会将status 属性映射到设备,.execute() 获取所有 DeviceStatus 属性但它不会映射实体。
const deviceQuery: Device = await this.deviceRepository
.createQueryBuilder("device")
.leftJoinAndSelect(subquery => {
return subquery
.from(DeviceStatus, "status")
.innerJoin(subquery => {
return subquery
.select(["status2.mac"])
.addSelect("MAX(created)", "lastdate")
.from(DeviceStatus, "status2")
.groupBy("status2.mac")
}, "status3", 'status.created = "status3"."lastdate"')
}, "status", 'device.mac = "status"."mac"')
.where('device.id = :id AND "device"."userId" = :user', {id: id, user: user.id})
.getOne();
【问题讨论】:
标签: node.js typescript nestjs typeorm