Search code examples
sqltypescripttypeorm

TypeORM: Set Relation to NULL in update


I have this Entity

@Entity({ name: 'orders' })
export class Order {
 ...

  @ManyToOne(() => BulkOrder, (bulkOrder) => bulkOrder.orders)
  bulkOrder?: BulkOrder
}

I'm trying to set the relation to null during an update

.createQueryBuilder()
.update(Order)
.set({ status: OrderStatus.OPEN, bulkOrder: undefined }).
where(...).execute()

but it's not updating the bulkOrder field, as evidenced in the query that it produces

query: UPDATE "orders" SET "status" = $1, "updated_at" = CURRENT_TIMESTAMP WHERE ("id" IN ($2, $3) ...

How can I set the relation to null? I know I could set it to null and save the entity but I need to use a query builder because I have to make sure to not update unwanted registries


Solution

  • From the database standpoint, relation is just a foreign key referencing a primary key. In your case, typeorm under the hood is creating a bulkOrderId column in orders table, referencing the id column from the table corresponding to the BulkOrder entity.

    In order to remove the relation, you have to set the bulkOrderId column to null. One of the proper ways to do this would be:

    @Entity({ name: 'orders' })
    export class Order {
     ...
    
      @ManyToOne(() => BulkOrder, (bulkOrder) => bulkOrder.orders)
      @JoinColumn({ name: 'bulkOrderId' })
      bulkOrder?: BulkOrder;
    
      @Column({ name: 'bulkOrderId' })
      bulkOrderId?: string;
    }
    
    .createQueryBuilder()
    .update(Order)
    .set({ status: OrderStatus.OPEN, bulkOrderId: null }).
    where(...).execute()