You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

门户用户执行SOQL子查询时遇Contact_Contact_Relationship__r关系识别错误

问题排查思路

问题场景

我们使用IndividualApplication对象、关联的自定义对象Application_Detail__c,以及另一个自定义对象Contact_Contact_Relationship__c。在IndividualApplication的beforeUpdate触发器中调用一段动态SOQL查询(精简版):

SELECT Id,
(SELECT Id,
Contact_Contact_Relationship__r.Contact.RDS_Disposition_Date__c,
Contact_Contact_Relationship__r.Contact.RDS_Disposition_Method__c,
Contact_Contact_Relationship__r.Contact.RDS_Rule__c
FROM Application_Details__r)
FROM IndividualApplication

管理员在开发者控制台调用该方法时运行正常,但门户用户通过LWC更新应用时触发异常:

System.QueryException: Didn't understand relationship 'Contact_Contact_Relationship__r' in field path.
If you are attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name.
Please reference your WSDL or the describe call for the appropriate names.

已为门户用户配置的权限集组包含以下只读权限:

  • IndividualApplication对象
  • Application_Detail__c对象
  • Contact_Contact_Relationship__c对象
  • Contact对象
  • Application_Detail__c.Individual_Application__c(主/明细)
  • Application_Detail__c.Contact_Contact_Relationship__c(查找)
  • Contact_Contact_Relationship__c.Contact(查找)
  • Contact对象的所有相关字段

解决思路

1. 验证自定义关系的API名称准确性

即使管理员执行正常,需确认Application_Detail__c到Contact_Contact_Relationship__c的查找字段的关系API名称是否确实为Contact_Contact_Relationship__r:

  • 进入Setup → 对象和字段 → 对象管理器 → Application_Detail__c → 字段和关系
  • 找到关联Contact_Contact_Relationship__c的查找字段,查看其「关系名称」(Relationship Name),加上__r才是SOQL中使用的关系名。注意关系名称可能与字段名不一致(例如字段名是Contact_Contact_Relationship__c,但关系名可能被修改为其他值)。

2. 检查门户用户对关系字段的访问权限

即使已授予对象权限,需确保门户用户对Application_Detail__c上的Contact_Contact_Relationship__c字段有只读权限:

  • 进入权限集 → 字段权限 → Application_Detail__c对象 → 确认Contact_Contact_Relationship__c字段的权限已勾选「只读」。
  • 注意:如果字段通过字段集或其他方式间接访问,需确保权限覆盖到位。

3. 确认关联对象的外部访问设置

需检查Contact_Contact_Relationship__c对象的外部访问设置是否允许门户用户查看:

  • 进入对象管理器 → Contact_Contact_Relationship__c → 设置 → 外部访问(External Access)
  • 确保已勾选「允许外部用户查看此对象」(Allow external users to view this object)。

4. 用描述调用验证用户可见的关系

在开发者控制台中,以门户用户身份执行以下Apex代码,查看Application_Detail__c对象的可用关系,确认Contact_Contact_Relationship__r在输出列表中存在:

System.runAs([SELECT Id FROM User WHERE Username = '门户用户用户名']) {
    Schema.DescribeSObjectResult appDetailDesc = Application_Detail__c.SObjectType.getDescribe();
    Map<String, Schema.Relationship> parentRels = appDetailDesc.getRelationships();
    
    System.debug('父关系列表:');
    for (String relName : parentRels.keySet()) {
        System.debug(relName + ' -> ' + parentRels.get(relName).getSObjectField());
    }
}

5. 检查Apex方法的共享模式

如果该Apex方法是被LWC调用的@AuraEnabled方法,需确认其共享模式:

  • 若方法未声明with sharing或without sharing,默认遵循with sharing(用户权限上下文),可能导致关系不可见。
  • 如需绕过用户权限(需谨慎评估合规性),可添加without sharing关键字;或确保用户拥有所有关联关系和字段的访问权限。

6. 排查字段级安全的间接影响

确认Contact_Contact_Relationship__c上的Contact查找字段对门户用户可见:

  • 在权限集中,检查Contact_Contact_Relationship__c对象的Contact字段权限是否为只读。

内容的提问来源于stack exchange,提问作者Plaidman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 21:43:20