TypeORM cascade option: cascade, onDelete, onUpdate

Sergey picture Sergey · Mar 11, 2019 · Viewed 12k times · Source

Do cascade options in TypeORM overlap or do they have a completely different purpose? Their description in the documentation is very scarce and partly missing, or I couldn't find it.

IOW, do the following options

{ cascade: "update" } = { onUpdate: 'CASCADE' }

{ cascade: "remove" } = { onDelete: 'CASCADE' }

have the same effect?

Or the cascade option is only for the TypeORM use while onUpdate and onDelete are only for the DB schema (created by migration)?

Answer

nomadoda picture nomadoda · Mar 11, 2019

This is my conclusion of looking into it:

The cascade option does not affect the database column constraints, and I believe is used by TypeORM only in evaluating how to save entity relations to the database. We can define entities like this:

@Entity()
class Book extends BaseEntity {
    @ManyToOne(() => Author, (author) => author.books, {
        onDelete: 'CASCADE',
    })
    public author?: Author
}

@Entity()
class Author extends BaseEntity {
    @OneToMany(() => Book, (book) => book.author, {
        cascade: true,
    })
    public books: Book[];
}

onDelete sets the authorId foreign key to CASCADE onDelete on Book. This means that when the author is deleted, the book is also deleted.

Setting cascade: true on Author tells TypeORM that if a new book is appended on an author and the author is saved, the new book should also be saved to the database. Like this:

const author = await Author.findOne({ id: '123' });
author.books.push(new Book(...));
await author.save();

If cascade is not set on Book, the new book will not be saved to the database.