TypeORM - внешний ключ не добавлен - PullRequest
0 голосов
/ 14 января 2020

У меня есть модели Order и OrderItems, где, когда я добавляю заказ, также должны добавляться элементы заказа. Элементы заказа добавляются, но столбец внешнего ключа пуст

Объект заказа

@Entity('orders')
export class OrderEntity {
    @PrimaryGeneratedColumn('uuid') order_id: string
    @Column('text') customer_email: string
    @CreateDateColumn() created_date: Date
    @Column('text') status: string
    @Column('decimal') amount: number
    @Column('integer') quantity: number
    @Column({ type: 'integer', nullable: true }) previous_quantity: number
    @OneToMany(type => InventoryEntity, inventory => inventory.order) inventories: InventoryEntity[];
    @OneToMany(type => OrderItemEntity, order_item => order_item.order) order_items: OrderItemEntity[];
}

Элемент элементов заказа

@Entity('orders_items')
export class OrderItemEntity {
    @PrimaryGeneratedColumn('uuid') order_item_id: string
    @CreateDateColumn() created_date: Date
    @Column('integer') quantity: number
    @Column({ type: 'integer', nullable: true }) previous_quantity: number
    @ManyToOne(type => OrderEntity, order => order.order_items)
    @JoinColumn({ name: 'order_id' })
    order: OrderEntity[];
}

Служба заказа

export class OrderService {
    constructor(
        @InjectRepository(OrderEntity) private orderRepository: Repository<OrderEntity>,
        private inventoryService: InventoryService,
        private orderItemService: OrderItemService) { }

    /**
     * Add order item
     * @param data Object
     */
    async add(data: OrderDTO) {
        const inventoryItems = []
        let quantityOfAllItemsRequested = 0;
        let priceOfAllItemsRequested = 0;
        // extract req data
        const { inventories, customer_email } = data

        // loop through all inventory items and put them into an array
        await Promise.each(inventories, async item => {
            const { name, quantity } = item

            // get inventory info for the specified item
            const inventoryItem = await this.inventoryService.getOneByName(name)

            // check if there is enough inventory to make order
            if (inventoryItem.quantity_available <= 0 || quantity > inventoryItem.quantity_available) {
                throw new Error(`Cannot add ${name} to order, insufficient quantities!`)
            }

            // add item to array
            if (inventoryItem) {
                inventoryItems.push(inventoryItem)
            }
            const amountForOneItem = inventoryItem.price * quantity

            priceOfAllItemsRequested += amountForOneItem
            quantityOfAllItemsRequested += quantity
        })

        // new order object
        const newOrder = {
            status: 'created',
            customer_email,
            amount: priceOfAllItemsRequested,
            quantity: quantityOfAllItemsRequested,
            inventories: inventoryItems,
        }

        // create new order
        const createdOrder = await this.orderRepository.create(newOrder)
        await this.orderRepository.save(createdOrder)
        // if the order was succesfully created, update inventory
        if (createdOrder) {
            // loop through each item and update the inventory entity
            await Promise.each(createdOrder.inventories, async updatedItem => {
                await Promise.each(inventories, async originalItem => {

                    // calculate new quantity available
                    const updatedInventoryItemQuantity = updatedItem.quantity_available - originalItem.quantity

                    // create order item
                    await this.orderItemService.add({
                        quantity: originalItem.quantity,
                        previous_quantity: 0,
                        order_id: createdOrder.order_id,
                    })

                    // update inventory
                    await this.inventoryService.edit(updatedItem.inventory_id, {
                        quantity_available: updatedInventoryItemQuantity,
                    })
                })
            })
        }

        // save created order changes to database
        await this.orderRepository.save(createdOrder)
        return createdOrder
    }
}

Служба заказа товара

async add(data: OrderItemDTO) {
    const orderItem = await this.orderItemRepository.create(data)
    await this.orderItemRepository.save(orderItem)
    return orderItem
}

Может кто-нибудь увидеть проблему?

...