typescript - NestJS - TypeORM - ManyToOne-entitet är odefinierad
Jag försöker länka till entiteterna Child & Client
Så jag har skapat 2 enheter:
// 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;
}
och
// 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[];
}
Jag kan skapa en client och en child. När jag får en client kan jag hämta alla hans children.
Men jag kan inte hämta en client med ett child :
Till exempel, i children.controller.ts
När jag besöker http://locahost:3000/children/1/parent
Jag gick på konsolen :
Jag är verkligen fast eftersom jag inte vet hur jag ska lösa det här problemet.
Här är 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 {}
Här är 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,
}
Redigera 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)
}
}
Tack för din hjälp 😀
Svar #1
Det verkar för mig som att du glömde lägga till @JoinColumn() på ManyToOne-sidan av denna relation. Försök förbättra din kod på detta sätt
@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;
}
Fäst också uppmärksamhet vid eager-parametern. Om den sätts till true kommer denna relation att laddas automatiskt även om du inte begärde det manuellt, annars måste du specificera att du vill att relationen ska laddas. Försök förbättra children.service.ts på detta sätt:
async getChild(id: number): Promise<Child> {
return await this.childRepository.findOne(id, {
relations: ['client']
})
}
eller så kan du ställa in denna relation som eager och den kommer att laddas automatiskt varje gång du laddar Child
@ManyToOne(type => Client, client => client.children, { eager: true })
@JoinColumn()
client: Client
Svar #2
som @Yevhenii nämner, du glömde att lägga till JoinColumn men du måste ange klientkolumnen:
@Entity()
export class Child extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column()
firstname: string;
@Column()
lastname: string;
@ManyToOne(()=> Client, (client) => client.children, { eager: false })
@JoinColumn([{ name: "clientId", referencedColumnName: "id" }])
client: Client
@Column()
clientId: number;
}
Tveka inte att berätta resultatet för mig.

