fix: 上游跟踪,fix- getSourceKeyByAssocation #3947

This commit is contained in:
bai.jingfeng 2024-04-07 17:53:02 +08:00
parent 8c71fbd5a2
commit 9f12aa8ae5
3 changed files with 28 additions and 21 deletions

View File

@ -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
*/

View File

@ -23,13 +23,11 @@ export const DataBlockResourceProvider: FC<{ children?: ReactNode }> = ({ childr
return sourceId;
}
if (association && parentRecord) {
const associationCollection = cm.getCollection(association);
if (associationCollection) {
const sourceKey = cm.getSourceKeyByAssocation(association);
const parentRecordData = parentRecord instanceof CollectionRecord ? parentRecord.data : parentRecord;
return parentRecordData[associationCollection.sourceKey || 'id'];
return parentRecordData[sourceKey];
}
}
}, [sourceId, parentRecord]);
}, [association, sourceId, parentRecord]);
const resource = useMemo(() => {
if (association) {

View File

@ -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<InheritanceCollectionMixin>(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);
};