我正在尝试使用SOQL从Task对象获取Contact / Lead电子邮件(我在PHP中创建一个接口以备份具有特定主题的消息)。这是我现在的询问:
SELECT Subject,Who.FirstName,Who.LastName,Who.Email,Who.Phone,Description FROM Task
这有效/不会产生错误并给我结果,但Who.Email
总是空的(同时,Who.Phone
也是如此,但这对此并不重要)。如果我尝试使用Email
,我会收到该字段不存在的错误,这很奇怪,因为Email
在任务字段下作为标准字段。
我也尝试了几次谷歌搜索,没有找到任何帮助。
答案 0 :(得分:2)
因为Task的WhoId和WhatId字段是多态的(即可以指向许多不同类型的对象),所以不能像通常相关的对象一样通过它们查询关系。相反,您必须执行2次SOQL查询,第一次获取任务信息,第二次获取Who指向的联系人或潜在客户的信息。
答案 1 :(得分:2)
要求Salesforce支持人员在您的组织中启用“Polymorphic SOQL”,然后您就可以确定它是Lead还是Contact。它目前在开发者预览版中,但它非常整洁。以下是示例用法:
或至少在代码中留下“TODO:重写此”评论;)
答案 2 :(得分:2)
如前所述,Task上的WhoId和WhatId字段是多态的(意味着它们可以指向多个目标对象。除非启用了SOQL Polymorphism功能,否则正如@eyescream所描述的那样,唯一的“相关”字段您可以查询的是'Name' API object上的那些,但有一些例外情况,这些情况在本文档中有记录。
示例1:select Who.FirstName, Who.LastName, Who.Email from Task
如果Contact / Lead填充了这些字段,这将返回FirstName和LastName的数据,但是,正如上面的文档所述,它将永远不会返回Who.Email的结果,因为{两个可能的目标对象都没有{1}}字段(联系人,潜在客户)是Who
对象。
示例2:User
如果您正在使用带有Case对象的队列,则Case的所有者可以是用户或组(其中Queue是一种类型)记录。由于select Owner.Name, Owner.Email from Case
和Name
都在Email
对象上,因此上述查询将始终返回Name的数据,如果目标对象是User,则它将返回Owner.Email的数据。
示例3:Name
这是一个非常有趣的例子,因为Case对象的“Name”字段实际上是select What.Name, WhatId from Task where What.Type in ('Case','Account','Solution')
,而不是Name ---还有一些其他标准对象带有“非标准”(具有讽刺意味)的Name字段,例如: SolutionTitle,然后还有其他甚至没有名称字段的人,比如CaseNumber
。但是,具有多态字段的Salesforce在技术上指向CampaignMember
对象的一个好处是上面的查询将返回Cases的结果!如果Case的CaseNumber是00001234,则上述查询中的What.Name将返回00001234,而对于Account,它将返回Account的名称,对于Solution,它将返回SolutionTitle。
在此处观察,您可以通过过滤“类型”字段来限制返回哪些目标对象,这是Name
对象上的特殊字段。
答案 3 :(得分:0)
在Console中尝试获取任务/事件的值
列表e1 =新列表(); e1 = [选择Id,whoId from event WHERE id =' 00U9xxxxxxxxxxx']; System.debug(' @@@@@&#39 + E1);
设置whoId = new Set(); for(event e2:e1){ whoId.add(e2.whoId); } list c = [选择姓名,电话,电子邮件来自 联系哪里Id IN:whoId]; System.debug(' @@@@@&#39 + C);
---------------- END -------------
由于