首页 > 解决方案 > NestJS - TypeORM - 多对一实体未定义

问题描述

我正在尝试链接到实体Child&Client

所以我创建了 2 个实体:

// src/children/child.entity.ts

@Entity()
export class Child extends BaseEntity {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstname: string;

  @Column()
  lastname: string;

  @ManyToOne(type => Client, client => client.children, { eager: false })
  client: Client

  @Column()
  clientId: number;
}

// src/clients/client.entity.ts

@Entity()
export class Client extends BaseEntity {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstname: string;

  @Column()
  lastname: string;

  @OneToMany(type => Child, child => child.client, { eager: true })
  children: Child[];

}

我能够创建一个client& a child。当我得到一个client时,我可以找回他所有的children.

但我无法client用 a 检索 a child

例如,在children.controller.ts

在此处输入图像描述

当我访问http://locahost:3000/children/1/parent

我上了控制台:

在此处输入图像描述

我真的被卡住了,因为我不知道如何解决这个问题。

这是children.module.ts

import { Module } from '@nestjs/common';
import { ChildrenController } from './children.controller';
import { ChildrenService } from './children.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ChildRepository } from './child.repository';
import { ClientRepository } from 'src/clients/client.repository';
import { ClientsService } from 'src/clients/clients.service';
import { Client } from 'src/clients/client.entity';

@Module({
  imports: [
    TypeOrmModule.forFeature([ChildRepository, ClientRepository, Client]),
  ],
  controllers: [ChildrenController],
  providers: [ChildrenService, ClientsService]
})
export class ChildrenModule {}

这是typeorm.config

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const typeOrmConfig: TypeOrmModuleOptions = {
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'myusername',
  password: '',
  database: 'mydatabase',
  entities: [__dirname + '/../**/*.entity.{js,ts}'],
  synchronize: true,
}

编辑 1:

children.controller.ts

// src/children/children.controller.ts

@Controller('children')
export class ChildrenController {

  constructor(
    private childrenService: ChildrenService,
    private clientsService: ClientsService
  ) {}

  @Get('/:id')
  async getChild(id: number): Promise<Child> {
    return await this.childrenService.getChild(id);
  }
}

children.service.ts

// src/children/children.service.ts

@Injectable()
export class ChildrenService {
  constructor(
    @InjectRepository(ChildRepository)
    private childRepository: ChildRepository,
    @InjectRepository(ClientRepository)
    private clientRepository: ClientRepository
  ) {}

  async getChild(id: number): Promise<Child> {
    return await this.childRepository.findOne(id)
  }
}

谢谢你的帮助

标签: typescriptentitynestjstypeormmany-to-one

解决方案


在我看来,您忘记了@JoinColumn()在这种关系的 ManyToOne 方面添加。尝试以这种方式增强您的代码


@Entity()
export class Child extends BaseEntity {

  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstname: string;

  @Column()
  lastname: string;

  @ManyToOne(type => Client, client => client.children, { eager: false })
  @JoinColumn()
  client: Client

  @Column()
  clientId: number;
}

另外,注意eager参数。如果它设置为true这个关系,即使你不需要手动加载它也会自动加载,否则你必须指定你想要加载关系。尝试children.service.ts像这样增强:

  async getChild(id: number): Promise<Child> {
    return await this.childRepository.findOne(id, {
      relations: ['client']
    })
  }

或者您可以将此关系设置为eager,每次加载时都会自动加载Child

  @ManyToOne(type => Client, client => client.children, { eager: true })
  @JoinColumn()
  client: Client

推荐阅读