From 6fb569cf0dc6f84323809e2fea89d09714957d0e Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Tue, 23 May 2023 15:03:32 +0800 Subject: [PATCH] fix: eager load with belongs to many with custom source key (#1913) --- .../src/eager-loading/eager-loading-tree.ts | 10 ++- .../__tests__/collection-categories.test.ts | 69 +++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 packages/plugins/collection-manager/src/__tests__/collection-categories.test.ts diff --git a/packages/core/database/src/eager-loading/eager-loading-tree.ts b/packages/core/database/src/eager-loading/eager-loading-tree.ts index 738e46463b..ceb878c079 100644 --- a/packages/core/database/src/eager-loading/eager-loading-tree.ts +++ b/packages/core/database/src/eager-loading/eager-loading-tree.ts @@ -82,6 +82,11 @@ export class EagerLoadingTree { pushAttribute(child, targetKey); } + if (associationType == 'BelongsToMany') { + const { sourceKey } = association; + pushAttribute(eagerLoadingTreeParent, sourceKey); + } + eagerLoadingTreeParent.children.push(child); if (include.include) { @@ -150,13 +155,16 @@ export class EagerLoadingTree { } if (associationType == 'BelongsToMany') { + const foreignKeyValues = node.parent.instances.map((instance) => instance.get(association.sourceKey)); + instances = await node.model.findAll({ transaction, + attributes: node.attributes, include: [ { association: association.oneFromTarget, where: { - [association.foreignKey]: ids, + [association.foreignKey]: foreignKeyValues, }, }, ], diff --git a/packages/plugins/collection-manager/src/__tests__/collection-categories.test.ts b/packages/plugins/collection-manager/src/__tests__/collection-categories.test.ts new file mode 100644 index 0000000000..90652520bc --- /dev/null +++ b/packages/plugins/collection-manager/src/__tests__/collection-categories.test.ts @@ -0,0 +1,69 @@ +import Database, { Collection as DBCollection } from '@nocobase/database'; +import Application from '@nocobase/server'; +import { createApp } from './index'; + +describe('Collection categories', () => { + let db: Database; + let app: Application; + let Collection: DBCollection; + let Field: DBCollection; + + beforeEach(async () => { + app = await createApp({ + database: { tablePrefix: '' }, + }); + db = app.db; + Collection = db.getCollection('collections'); + Field = db.getCollection('fields'); + }); + + afterEach(async () => { + await app.destroy(); + }); + + it('should create collection categories', async () => { + const category = await db.getRepository('collectionCategories').create({ + values: { + color: 'green', + name: 'test', + }, + }); + + const category2 = await db.getRepository('collectionCategories').create({ + values: { + color: 'yellow', + name: 'test2', + }, + }); + + const category3 = await db.getRepository('collectionCategories').create({ + values: { + color: 'red', + name: 'test3', + }, + }); + + await db.getRepository('collections').create({ + values: { + name: 'testCollection', + category: [category.get('id'), category2.get('id')], + }, + }); + + await db.getRepository('collections').create({ + values: { + name: 'testCollection2', + category: [category3.get('id'), category2.get('id')], + }, + }); + + const list = await db.getRepository('collections').find({ + fields: ['category.name', 'key'], + filter: { + name: 'testCollection', + }, + }); + + expect(list[0].get('category').length).toBe(2); + }); +});