Skip to content

Commit 1d73a90

Browse files
iMobspleerock
authored andcommitted
fix: createQueryBuilder relation remove works only if using ID (#2632) (#4734)
1 parent 81f4b43 commit 1d73a90

File tree

4 files changed

+115
-2
lines changed

4 files changed

+115
-2
lines changed

src/query-builder/RelationRemover.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ export class RelationRemover {
9090
}),
9191
...junctionMetadata.inverseColumns.map((column, columnIndex) => {
9292
const parameterName = "secondValue_" + firstColumnValIndex + "_" + secondColumnValIndex + "_" + columnIndex;
93-
parameters[parameterName] = firstColumnVal instanceof Object ? column.referencedColumn!.getEntityValue(secondColumnVal) : secondColumnVal;
93+
parameters[parameterName] = secondColumnVal instanceof Object ? column.referencedColumn!.getEntityValue(secondColumnVal) : secondColumnVal;
9494
return `${column.databaseName} = :${parameterName}`;
9595
})
9696
].join(" AND ");
@@ -108,4 +108,4 @@ export class RelationRemover {
108108
}
109109
}
110110

111-
}
111+
}
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {Entity} from "../../../../src/decorator/entity/Entity";
2+
import {PrimaryGeneratedColumn} from "../../../../src/decorator/columns/PrimaryGeneratedColumn";
3+
import {Column} from "../../../../src/decorator/columns/Column";
4+
import {Post} from "./Post";
5+
import {ManyToMany} from "../../../../src/decorator/relations/ManyToMany";
6+
7+
@Entity()
8+
export class Category {
9+
@PrimaryGeneratedColumn()
10+
id: number;
11+
12+
@Column()
13+
title: string;
14+
15+
@ManyToMany(type => Post, post => post.categories)
16+
posts: Post[];
17+
18+
}
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {Entity} from "../../../../src/decorator/entity/Entity";
2+
import {PrimaryGeneratedColumn} from "../../../../src/decorator/columns/PrimaryGeneratedColumn";
3+
import {Column} from "../../../../src/decorator/columns/Column";
4+
import {Category} from "./Category";
5+
import {ManyToMany} from "../../../../src/decorator/relations/ManyToMany";
6+
import {JoinTable} from "../../../../src/decorator/relations/JoinTable";
7+
8+
@Entity()
9+
export class Post {
10+
@PrimaryGeneratedColumn()
11+
id: number;
12+
13+
@Column()
14+
title: string;
15+
16+
@ManyToMany(type => Category, category => category.posts)
17+
@JoinTable()
18+
categories: Category[];
19+
20+
}

test/github-issues/2632/issue-2632.ts

+75
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import "reflect-metadata";
2+
import {createTestingConnections, closeTestingConnections, reloadTestingDatabases} from "../../utils/test-utils";
3+
import {Connection} from "../../../src/connection/Connection";
4+
import {Post} from "./entity/Post";
5+
import {Category} from "./entity/Category";
6+
import {expect} from "chai";
7+
8+
describe("github issues > #2632 createQueryBuilder relation remove works only if using ID", () => {
9+
10+
let connections: Connection[];
11+
before(async () => connections = await createTestingConnections({
12+
entities: [__dirname + "/entity/*{.js,.ts}"],
13+
schemaCreate: true,
14+
dropSchema: true,
15+
}));
16+
beforeEach(() => reloadTestingDatabases(connections));
17+
after(() => closeTestingConnections(connections));
18+
19+
it("should add and remove relations of an entity if given a mix of ids and objects", () => Promise.all(connections.map(async connection => {
20+
21+
const post1 = new Post();
22+
post1.title = "post #1";
23+
await connection.manager.save(post1);
24+
25+
const post2 = new Post();
26+
post2.title = "post #2";
27+
await connection.manager.save(post2);
28+
29+
const category1 = new Category();
30+
category1.title = "category #1";
31+
await connection.manager.save(category1);
32+
33+
const category2 = new Category();
34+
category2.title = "category #2";
35+
await connection.manager.save(category2);
36+
37+
await connection
38+
.createQueryBuilder()
39+
.relation(Post, "categories")
40+
.of(post1)
41+
.add(1);
42+
43+
let loadedPost1 = await connection.manager.findOne(Post, 1, { relations: ["categories"] });
44+
expect(loadedPost1!.categories).to.deep.include({ id: 1, title: "category #1" });
45+
46+
await connection
47+
.createQueryBuilder()
48+
.relation(Post, "categories")
49+
.of(post1)
50+
.remove(1);
51+
52+
loadedPost1 = await connection.manager.findOne(Post, 1, { relations: ["categories"] });
53+
expect(loadedPost1!.categories).to.be.eql([]);
54+
55+
await connection
56+
.createQueryBuilder()
57+
.relation(Post, "categories")
58+
.of(2)
59+
.add(category2);
60+
61+
let loadedPost2 = await connection.manager.findOne(Post, 2, { relations: ["categories"] });
62+
expect(loadedPost2!.categories).to.deep.include({ id: 2, title: "category #2" });
63+
64+
await connection
65+
.createQueryBuilder()
66+
.relation(Post, "categories")
67+
.of(2)
68+
.remove(category2);
69+
70+
loadedPost1 = await connection.manager.findOne(Post, 2, { relations: ["categories"] });
71+
expect(loadedPost1!.categories).to.be.eql([]);
72+
73+
})));
74+
75+
});

0 commit comments

Comments
 (0)