diff --git a/src/entity-manager/EntityManager.ts b/src/entity-manager/EntityManager.ts index 7d7d81b04c..9b3feca38f 100644 --- a/src/entity-manager/EntityManager.ts +++ b/src/entity-manager/EntityManager.ts @@ -778,7 +778,7 @@ export class EntityManager { typeof criteria === "string" || typeof criteria === "number" || criteria instanceof Date || - Array.isArray(criteria) + (Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null) ) { return this.createQueryBuilder() .update(target) @@ -832,7 +832,7 @@ export class EntityManager { typeof criteria === "string" || typeof criteria === "number" || criteria instanceof Date || - Array.isArray(criteria) + (Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null) ) { return this.createQueryBuilder() .delete() @@ -886,7 +886,7 @@ export class EntityManager { typeof criteria === "string" || typeof criteria === "number" || criteria instanceof Date || - Array.isArray(criteria) + (Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null) ) { return this.createQueryBuilder() .softDelete() @@ -940,7 +940,7 @@ export class EntityManager { typeof criteria === "string" || typeof criteria === "number" || criteria instanceof Date || - Array.isArray(criteria) + (Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null) ) { return this.createQueryBuilder() .restore() diff --git a/src/repository/Repository.ts b/src/repository/Repository.ts index 5a2d75415e..0fbace7b21 100644 --- a/src/repository/Repository.ts +++ b/src/repository/Repository.ts @@ -355,7 +355,8 @@ export class Repository { | Date[] | ObjectId | ObjectId[] - | FindOptionsWhere, + | FindOptionsWhere + | FindOptionsWhere[], partialEntity: QueryDeepPartialEntity, ): Promise { return this.manager.update( @@ -399,7 +400,8 @@ export class Repository { | Date[] | ObjectId | ObjectId[] - | FindOptionsWhere, + | FindOptionsWhere + | FindOptionsWhere[], ): Promise { return this.manager.delete(this.metadata.target as any, criteria as any) } @@ -420,7 +422,8 @@ export class Repository { | Date[] | ObjectId | ObjectId[] - | FindOptionsWhere, + | FindOptionsWhere + | FindOptionsWhere[], ): Promise { return this.manager.softDelete( this.metadata.target as any, @@ -444,7 +447,8 @@ export class Repository { | Date[] | ObjectId | ObjectId[] - | FindOptionsWhere, + | FindOptionsWhere + | FindOptionsWhere[], ): Promise { return this.manager.restore( this.metadata.target as any, diff --git a/test/github-issues/10517/entity/Post.ts b/test/github-issues/10517/entity/Post.ts new file mode 100644 index 0000000000..fdcbb69ea0 --- /dev/null +++ b/test/github-issues/10517/entity/Post.ts @@ -0,0 +1,10 @@ +import { Column, Entity, PrimaryGeneratedColumn } from "../../../../src" + +@Entity() +export class Post { + @PrimaryGeneratedColumn() + id: number + + @Column() + title: string +} diff --git a/test/github-issues/10517/issue-10517.ts b/test/github-issues/10517/issue-10517.ts new file mode 100644 index 0000000000..8bc916ba78 --- /dev/null +++ b/test/github-issues/10517/issue-10517.ts @@ -0,0 +1,138 @@ +import "reflect-metadata" +import { expect } from "chai" +import { DataSource } from "../../../src/data-source/DataSource" +import { + closeTestingConnections, + createTestingConnections, + reloadTestingDatabases, +} from "../../utils/test-utils" +import { Post } from "./entity/Post" + +describe("github issues > #10517 EntityManager update/delete/softDelete don't work with list of where condition objects", function () { + // ------------------------------------------------------------------------- + // Configuration + // ------------------------------------------------------------------------- + + let connections: DataSource[] + before( + async () => + (connections = await createTestingConnections({ + entities: [Post], + })), + ) + beforeEach(() => reloadTestingDatabases(connections)) + after(() => closeTestingConnections(connections)) + + // ------------------------------------------------------------------------- + // Specifications + // ------------------------------------------------------------------------- + + it("update by array of condition objects", () => + Promise.all( + connections.map(async (connection) => { + const postRepository = connection.getRepository(Post) + + // save a new posts + const newPost1 = postRepository.create() + newPost1.title = "Super post #1" + const newPost2 = postRepository.create() + newPost2.title = "Super post #2" + const newPost3 = postRepository.create() + newPost3.title = "Super post #3" + const newPost4 = postRepository.create() + newPost4.title = "Super post #4" + + await postRepository.save(newPost1) + await postRepository.save(newPost2) + await postRepository.save(newPost3) + await postRepository.save(newPost4) + + // update many + await postRepository.update( + [ + { + title: "Super post #1", + }, + { + title: "Super post #2", + }, + ], + { title: "Super post" }, + ) + + // load to check + const loadedPost1 = await postRepository.findOne({ + where: { + id: 1, + }, + }) + const loadedPost2 = await postRepository.findOne({ + where: { + id: 2, + }, + }) + + // assert + expect(loadedPost1).to.be.eql({ + id: 1, + title: "Super post", + }) + + expect(loadedPost2).to.be.eql({ + id: 2, + title: "Super post", + }) + }), + )) + + it("delete by array of condition objects", () => + Promise.all( + connections.map(async (connection) => { + const postRepository = connection.getRepository(Post) + + // save a new posts + const newPost1 = postRepository.create() + newPost1.title = "Super post #1" + const newPost2 = postRepository.create() + newPost2.title = "Super post #2" + const newPost3 = postRepository.create() + newPost3.title = "Super post #3" + const newPost4 = postRepository.create() + newPost4.title = "Super post #4" + + await postRepository.save(newPost1) + await postRepository.save(newPost2) + await postRepository.save(newPost3) + await postRepository.save(newPost4) + + // delete many + await postRepository.delete( + [ + { + title: "Super post #1", + }, + { + title: "Super post #2", + }, + ], + ) + + // load to check + const loadedPost1 = await postRepository.findOne({ + where: { + id: 1, + }, + }) + const loadedPost2 = await postRepository.findOne({ + where: { + id: 2, + }, + }) + + // assert + expect(loadedPost1).to.be.eql(null) + + expect(loadedPost2).to.be.eql(null) + }), + )) +})