diff --git a/src/query-builder/RelationRemover.ts b/src/query-builder/RelationRemover.ts index 8bbc7cce2e..41065f50d2 100644 --- a/src/query-builder/RelationRemover.ts +++ b/src/query-builder/RelationRemover.ts @@ -90,7 +90,7 @@ export class RelationRemover { }), ...junctionMetadata.inverseColumns.map((column, columnIndex) => { const parameterName = "secondValue_" + firstColumnValIndex + "_" + secondColumnValIndex + "_" + columnIndex; - parameters[parameterName] = firstColumnVal instanceof Object ? column.referencedColumn!.getEntityValue(secondColumnVal) : secondColumnVal; + parameters[parameterName] = secondColumnVal instanceof Object ? column.referencedColumn!.getEntityValue(secondColumnVal) : secondColumnVal; return `${column.databaseName} = :${parameterName}`; }) ].join(" AND "); @@ -108,4 +108,4 @@ export class RelationRemover { } } -} \ No newline at end of file +} diff --git a/test/github-issues/2632/entity/Category.ts b/test/github-issues/2632/entity/Category.ts new file mode 100644 index 0000000000..657daf5e52 --- /dev/null +++ b/test/github-issues/2632/entity/Category.ts @@ -0,0 +1,18 @@ +import {Entity} from "../../../../src/decorator/entity/Entity"; +import {PrimaryGeneratedColumn} from "../../../../src/decorator/columns/PrimaryGeneratedColumn"; +import {Column} from "../../../../src/decorator/columns/Column"; +import {Post} from "./Post"; +import {ManyToMany} from "../../../../src/decorator/relations/ManyToMany"; + +@Entity() +export class Category { + @PrimaryGeneratedColumn() + id: number; + + @Column() + title: string; + + @ManyToMany(type => Post, post => post.categories) + posts: Post[]; + +} diff --git a/test/github-issues/2632/entity/Post.ts b/test/github-issues/2632/entity/Post.ts new file mode 100644 index 0000000000..1f3c9c3946 --- /dev/null +++ b/test/github-issues/2632/entity/Post.ts @@ -0,0 +1,20 @@ +import {Entity} from "../../../../src/decorator/entity/Entity"; +import {PrimaryGeneratedColumn} from "../../../../src/decorator/columns/PrimaryGeneratedColumn"; +import {Column} from "../../../../src/decorator/columns/Column"; +import {Category} from "./Category"; +import {ManyToMany} from "../../../../src/decorator/relations/ManyToMany"; +import {JoinTable} from "../../../../src/decorator/relations/JoinTable"; + +@Entity() +export class Post { + @PrimaryGeneratedColumn() + id: number; + + @Column() + title: string; + + @ManyToMany(type => Category, category => category.posts) + @JoinTable() + categories: Category[]; + +} diff --git a/test/github-issues/2632/issue-2632.ts b/test/github-issues/2632/issue-2632.ts new file mode 100644 index 0000000000..fb655c97af --- /dev/null +++ b/test/github-issues/2632/issue-2632.ts @@ -0,0 +1,75 @@ +import "reflect-metadata"; +import {createTestingConnections, closeTestingConnections, reloadTestingDatabases} from "../../utils/test-utils"; +import {Connection} from "../../../src/connection/Connection"; +import {Post} from "./entity/Post"; +import {Category} from "./entity/Category"; +import {expect} from "chai"; + +describe("github issues > #2632 createQueryBuilder relation remove works only if using ID", () => { + + let connections: Connection[]; + before(async () => connections = await createTestingConnections({ + entities: [__dirname + "/entity/*{.js,.ts}"], + schemaCreate: true, + dropSchema: true, + })); + beforeEach(() => reloadTestingDatabases(connections)); + after(() => closeTestingConnections(connections)); + + it("should add and remove relations of an entity if given a mix of ids and objects", () => Promise.all(connections.map(async connection => { + + const post1 = new Post(); + post1.title = "post #1"; + await connection.manager.save(post1); + + const post2 = new Post(); + post2.title = "post #2"; + await connection.manager.save(post2); + + const category1 = new Category(); + category1.title = "category #1"; + await connection.manager.save(category1); + + const category2 = new Category(); + category2.title = "category #2"; + await connection.manager.save(category2); + + await connection + .createQueryBuilder() + .relation(Post, "categories") + .of(post1) + .add(1); + + let loadedPost1 = await connection.manager.findOne(Post, 1, { relations: ["categories"] }); + expect(loadedPost1!.categories).to.deep.include({ id: 1, title: "category #1" }); + + await connection + .createQueryBuilder() + .relation(Post, "categories") + .of(post1) + .remove(1); + + loadedPost1 = await connection.manager.findOne(Post, 1, { relations: ["categories"] }); + expect(loadedPost1!.categories).to.be.eql([]); + + await connection + .createQueryBuilder() + .relation(Post, "categories") + .of(2) + .add(category2); + + let loadedPost2 = await connection.manager.findOne(Post, 2, { relations: ["categories"] }); + expect(loadedPost2!.categories).to.deep.include({ id: 2, title: "category #2" }); + + await connection + .createQueryBuilder() + .relation(Post, "categories") + .of(2) + .remove(category2); + + loadedPost1 = await connection.manager.findOne(Post, 2, { relations: ["categories"] }); + expect(loadedPost1!.categories).to.be.eql([]); + + }))); + +});