typescript - 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)
}
}
谢谢你的帮助
解决方案
在我看来,您忘记了@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