SalesForce PHP API报错及ForEach循环重复返回相同名称问题
解决你的SalesForce PHP API两个问题
问题1:「Notice: Trying to get property of non-object」错误
这个警告本质是你在尝试访问一个非对象的属性,结合你的SOQL查询,主要有两个触发场景:
关联对象
Service_Account_DMKT__r为空
当某个Case记录没有关联的Service_Account_DMKT__r记录时,Service_Account_DMKT__r会是null,直接访问它的name属性就会抛出警告。
解决方法:访问前先做非空判断,比如在循环里:foreach($queryResult->records as $case) { // 处理关联账户名称 $accountName = isset($case->Service_Account_DMKT__r) ? $case->Service_Account_DMKT__r->name : '无关联账户'; // 其他业务逻辑... }Tasks子查询结果为空
如果某个Case没有关联的Tasks记录,子查询返回的可能是空数组或null,直接遍历或访问Activity_Type__c也会出错。处理逻辑类似:foreach($queryResult->records as $case) { // 处理关联任务 if(!empty($case->Tasks->records)) { foreach($case->Tasks->records as $task) { $activityType = $task->Activity_Type__c; // 任务相关逻辑... } } else { // 无任务时的处理逻辑 } }
问题2:ForEach循环反复返回相同名称
这个问题通常和变量处理或查询结果特性有关,常见原因及解决方法:
循环外变量未重置
如果你在循环外定义了存储名称的变量,且未在每次循环中初始化,就会保留上一次的值。比如:// 错误示例:变量未在循环内重置 $accountName = ''; foreach($queryResult->records as $case) { if(isset($case->Service_Account_DMKT__r)) { $accountName = $case->Service_Account_DMKT__r->name; } // 无关联账户时,$accountName会沿用之前的值 echo $accountName; }解决方法:在循环内初始化变量,确保每次循环都能覆盖值:
foreach($queryResult->records as $case) { $accountName = '无关联账户'; // 初始化默认值 if(isset($case->Service_Account_DMKT__r)) { $accountName = $case->Service_Account_DMKT__r->name; } echo $accountName; }SOQL子查询导致主记录重复
SalesForce的SOQL子查询特性:如果主记录关联了多条子记录(比如一个Case有3个Tasks),查询结果中主记录会重复出现3次。这会让你误以为循环返回相同名称,实则是同一条Case被多次遍历。
解决方法:如果不需要重复的主记录,可以在循环中做去重处理:$processedCaseIds = []; foreach($queryResult->records as $case) { if(in_array($case->Id, $processedCaseIds)) { continue; // 跳过已处理的Case } $processedCaseIds[] = $case->Id; // 当前Case的业务逻辑 }变量引用错误
检查循环中是否误引用了外部变量,比如写成$globalCase->Service_Account_DMKT__r->name而非$case->...,这会导致一直返回同一个值。
额外调试建议
- 可以用
print_r($queryResult)或var_dump($queryResult)打印查询结果结构,确认返回的数据是否符合预期。 - 建议用绑定变量优化SOQL查询,避免字符串拼接的错误和SQL注入风险:
$query = "SELECT accountId,Status,Id,Service_Account_DMKT__r.name,(select Activity_Type__c from Tasks) from case where Owner.Name = :name AND CreatedDate = THIS_MONTH AND Record_type_name__c='Performance Reviews' AND status NOT IN ('')"; $response = $mySforceConnection->query($query, ['name' => $name]);
内容的提问来源于stack exchange,提问作者StavenCross
相关产品推荐
相关产品推荐

