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, });