I am getting problem while defining 2 OneToMany relation in my Order entity
By the way files are …
//data-source.ts
import 'reflect-metadata';
import { DataSource } from 'typeorm';
import Shipaddress from './entity/ShipAddress';
import User from './entity/User';
import Text from './entity/TextDetails';
import Image from './entity/ImageDetails';
import Order from './entity/Order';
const { POSTGRES_HOST, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DATABASE } =
process.env;
export const pgConnection = new DataSource({
type: 'postgres',
host: POSTGRES_HOST,
port: 5432,
username: POSTGRES_USER,
password: POSTGRES_PASSWORD,
database: POSTGRES_DATABASE,
synchronize: true,
logging: true,
ssl: {
rejectUnauthorized: false,
},
entities: [User, Shipaddress, Order, Image, Text],
migrations: ['src/db/migration/*.ts'],
subscribers: ['src/db/subscriber/*.ts'],
});
export const getDBConnection = async (): Promise<DataSource> => {
if (!pgConnection.isInitialized) {
await pgConnection.initialize();
}
return pgConnection;
};
and
//Order.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
OneToMany,
} from 'typeorm';
import User from './User';
import Image from './ImageDetails';
import Text from './TextDetails';
import { PaymentStatus } from '@/lib/definition';
@Entity({ name: 'Orders' })
export default class Order {
@PrimaryGeneratedColumn('uuid')
orderId!: string;
@Column()
aparel!: string;
@Column()
color!: string;
@Column()
size!: string;
@Column()
quality!: string;
@Column({
type: 'enum',
enum: PaymentStatus,
default: PaymentStatus.PENDING,
})
paymentStatus!: PaymentStatus;
@ManyToOne(() => User, (user) => user, {
onDelete: 'CASCADE',
})
user!: User;
@OneToMany(() => Text, (text) => text.order)
texts!: Text[];
@OneToMany(() => Image, (image) => image.order)
images!: Image[];
@CreateDateColumn()
createdAt!: Date;
@UpdateDateColumn()
updatedAt!: Date;
}
//TextDetails.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import Order from './Order';
import { PrintAreaEnum } from '@/lib/definition';
@Entity({ name: 'Texts' })
export default class Text {
@PrimaryGeneratedColumn('uuid')
textId!: string;
@Column({ type: 'enum', enum: PrintAreaEnum })
printArea!: PrintAreaEnum;
@Column()
text!: string;
@Column('decimal', { precision: 5, scale: 2 })
top!: number;
@Column('decimal', { precision: 5, scale: 2 })
left!: number;
@Column()
fill!: string;
@Column()
fontSize!: number;
@Column()
fontFamily!: string;
@Column('decimal', { precision: 5, scale: 2 })
scaleX!: number;
@Column('decimal', { precision: 5, scale: 2 })
scaleY!: number;
@Column('decimal', { precision: 5, scale: 2 })
angle!: number;
@ManyToOne(() => Order, (order) => order.texts, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'orderId' })
order!: Order;
@CreateDateColumn()
createdAt!: Date;
@UpdateDateColumn()
updatedAt!: Date;
}
and
//ImageDetails.ts
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
ManyToOne,
JoinColumn,
} from 'typeorm';
import Order from './Order';
@Entity({ name: 'Images' })
export default class Image {
@PrimaryGeneratedColumn('uuid')
imageId!: string;
@Column()
printArea!: string;
@Column()
imageUrl!: string;
@Column('decimal', { precision: 5, scale: 3 })
left!: number;
@Column('decimal', { precision: 5, scale: 3 })
top!: number;
@Column('decimal', { precision: 5, scale: 3 })
scaleX!: number;
@Column('decimal', { precision: 5, scale: 3 })
scaleY!: number;
@ManyToOne(() => Order, (order) => order.images, { onDelete: 'CASCADE' })
@JoinColumn({ name: 'orderId' })
order!: Order;
@CreateDateColumn()
createdAt!: Date;
@UpdateDateColumn()
updatedAt!: Date;
}
with this relationship...
I was expecting the related images, texts would come with this api
import { NextRequest, NextResponse } from 'next/server';
import { getDBConnection } from '@/db/data-source';
import User from '@/db/entity/User';
import Order from '@/db/entity/Order';
import Text from '@/db/entity/TextDetails';
import Image from '@/db/entity/ImageDetails';
export const GET = async (
request: Request,
{ params }: { params: { id: string } },
) => {
const { id } = params;
const connection = await getDBConnection();
const orderRepo = connection.getRepository(Order);
const textRepo = connection.getRepository(Text);
const imageRepo = connection.getRepository(Image);
const order = await orderRepo.findOne({
where: { orderId: id },
relations: ['texts', 'images'],
});
if (!order) {
return new NextResponse(
JSON.stringify({ success: false, message: 'Error loading data' }),
{ status: 404 },
);
}
return new NextResponse(
JSON.stringify({
success: true,
message: 'Order found',
order,
}),
{ status: 200 },
);
};
but i am getting error:
{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"development","isFallback":false,"err":{"name":"ReferenceError","source":"server","message":"Cannot access 'Order' before initialization","stack":"ReferenceError: Cannot access 'Order' before initializationn at Module.default (C:\Users\sagar\Desktop\Yaki\Yaki\.next\server\chunks\src_7f056a._.js:288:20)n at C:\Users\sagar\Desktop\Yaki\Yaki\.next\server\chunks\src_7f056a._.js:267:339n at [project]/src/db/entity/ImageDetails.ts [app-route] (ecmascript) (C:\Users\sagar\Desktop\Yaki\Yaki\.
but the surprising thing is when i comment out one of th OneToMany relation (either image or text)
it works flawlessly, but not when it have both OneToMany relations.
New contributor
simplyalearner is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.