From 12e68241537ae10dd4d1c3425916425f256cdf53 Mon Sep 17 00:00:00 2001 From: YANG QIA <2013xile@gmail.com> Date: Tue, 1 Apr 2025 23:28:41 +0800 Subject: [PATCH] fix(db): `filterByTk` is ignored when both `filter` and `filterByTk` are used in o2m deletion (#6606) * fix(db): `filterByTk` is ignored when both `filter` and `filterByTk` are used in o2m deletion * test: add test --- .../has-many-repository.test.ts | 46 +++++++++++++++++++ .../relation-repository/hasmany-repository.ts | 8 +++- .../multiple-relation-repository.ts | 10 +++- 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/packages/core/database/src/__tests__/relation-repository/has-many-repository.test.ts b/packages/core/database/src/__tests__/relation-repository/has-many-repository.test.ts index 78793cc356..2cd0dd6bb7 100644 --- a/packages/core/database/src/__tests__/relation-repository/has-many-repository.test.ts +++ b/packages/core/database/src/__tests__/relation-repository/has-many-repository.test.ts @@ -159,6 +159,7 @@ describe('has many repository', () => { name: 'posts', fields: [ { type: 'string', name: 'title' }, + { type: 'belongsTo', name: 'user' }, { type: 'belongsToMany', name: 'tags', through: 'posts_tags' }, { type: 'hasMany', name: 'comments' }, { type: 'string', name: 'status' }, @@ -480,6 +481,51 @@ describe('has many repository', () => { ).not.toBeNull(); }); + test('destroy by pk and filter with association', async () => { + const u1 = await User.repository.create({ + values: { name: 'u1' }, + }); + + const UserPostRepository = new HasManyRepository(User, 'posts', u1.id); + + const p1 = await UserPostRepository.create({ + values: { + title: 't1', + status: 'published', + user: u1, + }, + }); + + const p2 = await UserPostRepository.create({ + values: { + title: 't2', + status: 'draft', + user: u1, + }, + }); + + await UserPostRepository.destroy({ + filterByTk: p1.id, + filter: { + user: { + id: u1.id, + }, + }, + }); + + expect( + await UserPostRepository.findOne({ + filterByTk: p1.id, + }), + ).toBeNull(); + + expect( + await UserPostRepository.findOne({ + filterByTk: p2.id, + }), + ).not.toBeNull(); + }); + test('destroy by pk', async () => { const u1 = await User.repository.create({ values: { name: 'u1' }, diff --git a/packages/core/database/src/relation-repository/hasmany-repository.ts b/packages/core/database/src/relation-repository/hasmany-repository.ts index f831166d67..4720a6fa59 100644 --- a/packages/core/database/src/relation-repository/hasmany-repository.ts +++ b/packages/core/database/src/relation-repository/hasmany-repository.ts @@ -72,7 +72,13 @@ export class HasManyRepository extends MultipleRelationRepository { const filterResult = this.parseFilter(options['filter'], options); if (filterResult.include && filterResult.include.length > 0) { - return await this.destroyByFilter(options['filter'], transaction); + return await this.destroyByFilter( + { + filter: options['filter'], + filterByTk: options['filterByTk'], + }, + transaction, + ); } where.push(filterResult.where); diff --git a/packages/core/database/src/relation-repository/multiple-relation-repository.ts b/packages/core/database/src/relation-repository/multiple-relation-repository.ts index af3ed91525..9a649fa97c 100644 --- a/packages/core/database/src/relation-repository/multiple-relation-repository.ts +++ b/packages/core/database/src/relation-repository/multiple-relation-repository.ts @@ -179,9 +179,15 @@ export abstract class MultipleRelationRepository extends RelationRepository { return false; } - protected async destroyByFilter(filter: Filter, transaction?: Transaction) { + protected async destroyByFilter( + options: { + filter?: Filter; + filterByTk?: TargetKey | TargetKey[]; + }, + transaction?: Transaction, + ) { const instances = await this.find({ - filter: filter, + ...options, transaction, });