要实现这一点,您需要确保您的实体文件具有正确的关系装饰器。做出一些假设,但是:
主管实体/模式:
// imports typeorm
import {Entity, Column, OneToMany} from 'typeorm';
import {Manager} from '../../manager/entities/manager.entity';
@Entity()
export class Supervisor{
// relationship column assuming supervisor has many managers
@OneToMany(() => Manager, (manager) => manager.supervisor))
managers: Manager[];
}
现在和经理一样:
// imports typeorm
import {Entity, Column, OneToMany, ManyToOne} from 'typeorm';
import {Agent} from '../../agent/entities/agent.entity';
import {Supervisor} from '../../supervisor/entities/supervisor.entity';
@Entity()
export class Manager{
// reverse supervisor relationship
@ManyToOne(() => Supervisor, (supervisor) => supervisor.managers)
supervisor: Supervisor;
// relationship column
@OneToMany(() => Agent, (agent) => agent.manager))
agents: Agent[];
}
现在介绍代理:
// imports typeorm
import {Entity, Column, ManyToOne} from 'typeorm';
import {Manager} from '../../manager/entities/manager.entity';
@Entity()
export class Agent{
// reverse manager relationship
@ManyToOne(() => Manager, (manager) => manager.agents)
manager: Manager;
}
如果您在实体中没有 {eager:true} 用于关系选项,您的查询将看起来不太漂亮,从主管的角度来看,它会是这样的:
//import typeorm and other imports needed
import {EntityRepository, Repository} from 'typeorm';
import {Supervisor} from '../../supervisor/entities/supervisor.entity';
@EntityRepository(Supervisor)
export class SupervisorRepository extends Repository<Supervisor>{
async getManagerAndAgents(supervisorId: string){
let from = new Date().toISOString();
let to = new Date().toISOString(); //pretend this is different than to
return await this.createQueryBuilder('supervisor')
.leftJoinAndSelect(
'supervisor.managers', // relationship declared in entity
'manager', // the name of the left join, think of it like 'AS' in sql
)
.leftJoinAndSelect(
'manager.tasks', // relationship in manager entity to tasks
'task',
`task.date BETWEEN '${from}' AND '${to}'` // where condition
)
.leftJoinAndSelect(
'manager.agents',
'agent'
)
.leftJoinAndSelect(
'agent.tasks',
'agentTasks',
`agentTasks.date BETWEEN '${from}' AND '${to}'` // or whatever you need (<, >)
)
.where('supervisor.id = :id', {id: supervisorId})
.getOne();
}
}
写完之后——亲爱的耶稣让我们有更好的方法,我不介意犯错。另外,请正确编写此代码。
我从来没有找到不使用 createQueryBuilder 来使用日期的好方法。