fix: getSourceKeyByAssocation (#3947)

* fix: getSourceKeyByAssocation

* fix: getSourceKeyByAssocation
This commit is contained in:
chenos 2024-04-07 08:28:42 +08:00 committed by GitHub
parent f1f9f3ec28
commit 04762f4028
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 30 additions and 24 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

@ -1,11 +1,11 @@
import { IResource } from '@nocobase/sdk';
import React, { FC, ReactNode, createContext, useContext, useMemo } from 'react';
import { useCollectionManager } from '../collection';
import { useDataBlockProps } from './DataBlockProvider';
import { useAPIClient } from '../../api-client';
import { useCollectionManager } from '../collection';
import { CollectionRecord } from '../collection-record';
import { useDataSourceHeaders } from '../utils';
import { useDataBlockProps } from './DataBlockProvider';
export const DataBlockResourceContext = createContext<IResource>(null);
DataBlockResourceContext.displayName = 'DataBlockResourceContext';
@ -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) {

View File

@ -1,4 +1,3 @@
import { InheritanceCollectionMixin } from '../../collection-manager/mixins/InheritanceCollectionMixin';
import { useCollectionManager } from '../../data-source/collection/CollectionManagerProvider';
/**
@ -8,19 +7,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);
};