Und es gibt die folgenden Beziehungen:
Code: Select all
module 1:1 combo
codefunc 1:1 node
link 1:1 edge

Die DetailtypORM-Entitäten:
Code: Select all
@Entity()
@Unique(['path', 'moduleName'])
export class ComboModule {
@PrimaryGeneratedColumn()
id: number | undefined
// Combo
@OneToOne(type => Combo)
@JoinColumn()
combo: Combo | undefined;
@Column({
type: 'varchar',
})
path: string
@Column({
type: 'varchar',
})
moduleName: string
@Column({
type: 'text'
})
desc?: string
@ManyToOne(type => ComboModule)
parent?: ComboModule | null
@OneToMany(type => NodeCodeFunc, codeFunc => codeFunc.module)
codeFuncs: NodeCodeFunc[] | undefined
@Column({
default: false,
type: 'boolean'
})
isDeleted: boolean | undefined
@CreateDateColumn()
createDate?: Date
@UpdateDateColumn()
updateDate?: Date
constructor(moduleName: string = '', path: string, desc: string | undefined = '', parent: ComboModule| null) {
this.moduleName = moduleName
this.desc = desc
this.path = path
this.parent = parent
}
}
@Entity()
export class EdgeCommonSupport {
@PrimaryGeneratedColumn()
id: number | undefined
// Combo
@OneToOne(type => Edge)
@JoinColumn()
edge: Edge | undefined;
@Column({
type: 'varchar',
default: 'support'
})
supportName: string | undefined
@Column({
type: 'text'
})
desc?: string
@Column({
default: false,
type: 'boolean'
})
isDeleted: boolean | undefined
@CreateDateColumn()
createDate?: Date
@UpdateDateColumn()
updateDate?: Date
constructor(supportName: string = '', desc: string | undefined = '' ) {
this.supportName = supportName
this.desc = desc
}
}
@Entity()
@Unique(['path', 'codefuncName'])
export class NodeCodeFunc {
@PrimaryGeneratedColumn()
id: number | undefined
// Combo
@OneToOne(type => Node)
@JoinColumn()
node: Node | undefined;
@Column({
type: 'varchar',
})
path: string | undefined
@Column({
type: 'varchar',
})
codefuncName: string
@Column({
type: 'text'
})
desc?: string
@ManyToOne(type => ComboModule, module => module.codeFuncs)
module: ComboModule | null
@Column({
default: false,
type: 'boolean'
})
isDeleted: boolean | undefined
@CreateDateColumn()
createDate?: Date
@UpdateDateColumn()
updateDate?: Date
constructor(path: string, codefuncName: string = '', desc: string | undefined = '', module: ComboModule | null) {
this.path = path
this.codefuncName = codefuncName
this.desc = desc
this.module = module
}
}
@Entity()
export class Node {
@PrimaryGeneratedColumn()
id: number | undefined
// ProjMod
@ManyToOne(type => ProjMod, projMod => projMod.Nodes)
projMod: ProjMod
@Column({
default: false,
type: 'boolean'
})
isDeleted: boolean | undefined
@CreateDateColumn()
createDate?: Date
@UpdateDateColumn()
updateDate?: Date
constructor(projMod: ProjMod) {
this.projMod = projMod
}
}
export const EdgeConnectType = {
NodeToNode: 'NodeToNode',
NodeToCombo: 'NodeToCombo',
ComboToCombo: 'ComboToCombo',
ComboToNode: 'ComboToNode'
}
@Entity()
export class Edge {
@PrimaryGeneratedColumn()
id: number | undefined
// ProjMod
@ManyToOne(type => ProjMod, projMod => projMod.Nodes)
projMod: ProjMod
@Column({
type: 'varchar',
nullable: true,
default: EdgeConnectType.NodeToNode
})
connecttype: string | undefined
// Node:source
@OneToOne(type => Node)
@JoinColumn()
NodeSource?: Node
// Node:target
@OneToOne(type => Node)
@JoinColumn()
NodeTarget?: Node
// Combo:source
@OneToOne(type => Combo)
@JoinColumn()
ComboSource?: Combo
// Combo:target
@OneToOne(type => Combo)
@JoinColumn()
ComboTarget?: Combo
@Column({
default: false,
type: 'boolean'
})
isDeleted: boolean | undefined
@CreateDateColumn()
createDate?: Date
@UpdateDateColumn()
updateDate?: Date
constructor(projMod: ProjMod) {
this.projMod = projMod
}
}
@Entity()
export class Combo {
@PrimaryGeneratedColumn()
id: number | undefined
// ProjMod
@ManyToOne(type => ProjMod, projMod => projMod.Nodes)
projMod: ProjMod
@Column({
default: false,
type: 'boolean'
})
isDeleted: boolean | undefined
@CreateDateColumn()
createDate?: Date
@UpdateDateColumn()
updateDate?: Date
constructor(projMod: ProjMod) {
this.projMod = projMod
}
}
Zum Beispiel auf die folgende Weise (fein- Tuning kann erforderlich sein):
Code: Select all
export const ModulesWithCodefuncs = publicProcedure.input(z.object({
projModId: z.number()
})).query(async ({input: {projModId}}) => {
const modules = await dataBase.getRepository(ComboModule)
.createQueryBuilder('ComboModule')
.where("combo.projMod.isDeleted = :isDeleted", { isDeleted: false })
.andWhere("combo.projMod.id = :projModId", { projModId: projModId })
.leftJoinAndSelect('ComboModule.combo', 'combo')
.leftJoinAndSelect('ComboModule.codeFuncs', 'codeFuncs')
.getMany()
return modules
})
EDIT-01
Das tue ich nicht Ich habe eine Idee, wie man es über typeorm abfragt.
Das Einzige, was mir in den Sinn kommt, ist, alle Kanten und das hier abgefragte Modul + Codefunktion abzufragen und dann zu iterieren Die Kanten werden beurteilt, ob die Quelle/das Ziel der Kante zugehört module/codefunc, und behalten Sie es, falls vorhanden.