diff --git a/packages/core/client/src/data-source/collection/CollectionManager.ts b/packages/core/client/src/data-source/collection/CollectionManager.ts index bcfd68394..41d7b7b00 100644 --- a/packages/core/client/src/data-source/collection/CollectionManager.ts +++ b/packages/core/client/src/data-source/collection/CollectionManager.ts @@ -131,6 +131,29 @@ export class CollectionManager { return this.getCollection(collectionName)?.getFields(predicate) || []; } + getSourceKeyByAssocation(associationName: string) { + if (!associationName) { + return; + } + const field = this.getCollectionField(associationName); + // 字段不存在,返回空 + if (!field) { + return; + } + // hasOne 和 hasMany 和 belongsToMany 的字段存在 sourceKey,所以会直接返回 sourceKey; + if (field.sourceKey) { + return field.sourceKey; + } + // belongsTo 不存在 sourceKey,所以会使用 filterTargetKey; + const sourceCollection = this.getCollection(associationName.split('.')[0]); + // source collection 不存在,返回空 + if (!sourceCollection) { + return; + } + // 后面的主键和 id 是为了保险起见加上的; + return sourceCollection.filterTargetKey || sourceCollection.getPrimaryKey() || 'id'; + } + /** * @internal */ diff --git a/packages/core/client/src/data-source/data-block/DataBlockResourceProvider.tsx b/packages/core/client/src/data-source/data-block/DataBlockResourceProvider.tsx index 957a82c20..0c20f5cea 100644 --- a/packages/core/client/src/data-source/data-block/DataBlockResourceProvider.tsx +++ b/packages/core/client/src/data-source/data-block/DataBlockResourceProvider.tsx @@ -23,13 +23,11 @@ export const DataBlockResourceProvider: FC<{ children?: ReactNode }> = ({ childr return sourceId; } if (association && parentRecord) { - const associationCollection = cm.getCollection(association); - if (associationCollection) { - const parentRecordData = parentRecord instanceof CollectionRecord ? parentRecord.data : parentRecord; - return parentRecordData[associationCollection.sourceKey || 'id']; - } + const sourceKey = cm.getSourceKeyByAssocation(association); + const parentRecordData = parentRecord instanceof CollectionRecord ? parentRecord.data : parentRecord; + return parentRecordData[sourceKey]; } - }, [sourceId, parentRecord]); + }, [association, sourceId, parentRecord]); const resource = useMemo(() => { if (association) { diff --git a/packages/core/client/src/modules/blocks/useSourceKey.ts b/packages/core/client/src/modules/blocks/useSourceKey.ts index 5b63e2ed1..442f168f4 100644 --- a/packages/core/client/src/modules/blocks/useSourceKey.ts +++ b/packages/core/client/src/modules/blocks/useSourceKey.ts @@ -8,19 +8,5 @@ import { useCollectionManager } from '../../data-source/collection/CollectionMan */ export const useSourceKey = (association: string) => { const cm = useCollectionManager(); - - if (!association) return; - - const associationField = cm.getCollectionField(association); - - if (!associationField) { - return; - } - - const sourceCollection = cm.getCollection(association.split('.')[0]); - - // 1. hasOne 和 hasMany 和 belongsToMany 的字段存在 sourceKey,所以会直接返回 sourceKey; - // 2. belongsTo 不存在 sourceKey,所以会使用 filterTargetKey; - // 3. 后面的主键和 id 是为了保险起见加上的; - return associationField.sourceKey || sourceCollection.filterTargetKey || sourceCollection.getPrimaryKey() || 'id'; + return cm.getSourceKeyByAssocation(association); };