Skip to main content
Build the future with Agentforce at TDX in San Francisco or on Salesforce+ on March 5–6. Register now.

用自定义对象创建关系查询

学习目标

完成本单元后,您将能够:

  • 解释方案生成器中的图表以识别对象关系。
  • 识别在自定义对象查询中使用的自定义关系名称。
  • 为自定义对象创建子到父查询。
  • 为自定义对象创建父到子查询。
备注

备注

用中文(简体)学习?在中文(简体)Trailhead Playground 中开始挑战,用括号中提供的译文完成挑战。仅复制并粘贴英文值,因为挑战验证基于英文数据。如果在中文(简体)组织中没有成功通过挑战,我们建议您 (1) 将区域设置切换为美国,(2) 按此处说明将语言切换为英文,(3) 再次单击“检查挑战”按钮。

查看 Trailhead 本地化语言徽章详细了解如何利用 Trailhead 译文。

跟随 Trail Together 进行学习

进行这一步骤时,想要跟随专家一起学习吗?查看此视频,它是 Trailhead Live 上 Trail Together 系列的一部分。

(此视频片段从 51:38 开始,如果您想要倒回去再次观看步骤的开头部分可以从这里开始。)

启动您的 Trailhead Playground 并安装软件包

本模块剩余部分的示例和实践活动以一个房地产应用程序 DreamHouse 为例。我们开始在您的 Trailhead Playground 中安装这个应用程序并导入样本数据吧。

如果还没有打开 Trailhead Playground,请先启动。如果在组织中看到标有“安装软件包”的选项卡,那就太好了。跳过去,直接去步骤 1。如果没看到,请从应用程序启动器 (应用程序启动器) 中找到并打开 Playground Starter,然后按照相应步骤操作。如果您没有看到 Playground Starter 应用,请复制这个 Dreamhouse 安装包的链接并查看 Trailhead 帮助中的安装软件包或应用程序,完成 Trailhead 挑战

  1. 单击安装软件包选项卡。
  2. 04t3h000004mBpiAAE 粘贴到相应字段中。
  3. 单击安装
  4. 选择仅为管理员安装,之后单击安装
  5. 如果弹出提示要批准第三方访问权限,请选择是的,授予访问……,然后单击继续

软件包安装完成后,您会看到一个确认页面,并会收到一封发送至 Playground 关联邮箱地址的电子邮件。

导入 DreamHouse 数据

  1. 单击 应用程序启动器,在搜索框中输入 Dream,然后选择 DreamHouse 应用程序。
  2. 单击设置选项卡。(如果没看到“设置”选项卡,请展开更多列表。)
  3. 单击导入数据
  4. 单击 Properties(房产)选项卡,熟悉样本数据。

探索 DreamHouse 方案

到目前为止,我们只查询了标准对象。现在我们讨论如何查询自定义对象。我们使用 DreamHouse 应用程序中的对象,因此我们首先要检查 DreamHouse 方案(数据模型),以了解数据的结构是怎样的。

打开方案生成器

  1. 在 Trailhead Playground 中,单击 设置 并选择设置
  2. 单击对象管理器
  3. 单击方案生成器
  4. 在“对象”选项卡中,单击清除所有
  5. 如果您看到的是 Broker 而不是 Broker__c,请单击查看选项,然后选择显示元素名称
  6. 记住在代码中我们使用字段 API 名称。“显示元素名称”向我们显示字段 API 名称而不是字段标签。(自定义对象的 API 名称是末尾添加了 __c [两个下划线和 c] 的自定义对象名称。)

  7. 在“从下面选择”列表中,选择自定义对象
  8. 选择 Broker__cProperty__c。我们在本单元中会用到这两个自定义对象。
  9. 单击自动布局
  10. 检查房产字段。
  11. Property__c 自定义对象有两个自定义字段:Picture__c 和 Broker__c。(自定义字段的 API 名称是末尾添加了 __c [两个下划线和 c] 的自定义字段名称。)

    方案生成器显示 Broker__c 和 Property__c 自定义对象。在 Property__c 自定义对象上,突出显示 Broker__c 和 Picture__c 自定义字段。

  12. 把鼠标悬停在关联 Property__c 与 Broker__c 的关联线上方。
  13. 从 Property__c 自定义对象上的 Broker__c 自定义字段,有一个到 Broker__c 自定义对象的查找关系。

    方案生成器中的 Broker__c 和 Property__c 自定义对象。Property__c 对象上的 Broker__c 自定义字段有一个从 Property__c 自定义对象到 Broker__c 自定义对象的查找关系。

  14. 在 Property__c 元素上,单击齿轮图标,然后选择查看对象
    对象管理器打开,显示 Property__c 对象。
  15. 单击字段和关系
  16. 单击 Broker(经纪人)字段标签。
  17. 在“查找选项”中,找到“子级关系名称”。

现在我们知道 Property__c 是 Broker__c 的一个子项,房产与经纪人之间的关系名称是 Properties。(记住,这个关系名称通常是子对象名称的复数形式。)

查询自定义对象

查询自定义对象跟查询标准对象很像,只有几点不同。

考虑这项要求:

“获得所有房产的列表,带房产地址、图片以及指定经纪人。”

非常直接,对吧?我们查询 Property__c 自定义对象,获得 Address__c、Picture__c 和 Broker__c 自定义字段。我们来试一试。

创建查询

  1. 在查询编辑器中,输入:
    SELECT Address__c, Picture__c, Broker__c FROM Property__c
  2. 单击执行
    结果的前六行应该是:
    查询结果——总行数:12
    Address__c
    Picture__c
    Broker__c
    18 Henry st
    https://s3-us-west-2.amazonaws.com...
    a016g000007Yxfn...
    24 Pearl st
    https://s3-us-west-2.amazonaws.com...
    a016g000007Yxfn...
    72 Francis st
    https://s3-us-west-2.amazonaws.com...
    a016g000007Yxfn...
    32 Prince st
    https://s3-us-west-2.amazonaws.com...
    a016g000007Yxfn...
    110 Baxter st
    https://s3-us-west-2.amazonaws.com...
    a016g000007Yxfn...
    448 Hannover St
    https://s3-us-west-2.amazonaws.com...
    a016g000007Yxfn...

请注意,Broker__c 列的内容没什么用。那是因为 Property__c 对象中的 Broker__c 字段查找 Broker(经纪人)对象。带查找关系的字段含相关对象的 Id。要获得经纪人的名称,我们需要关系查询。

创建子到父查询

由于 Broker__c 是 Property__c 的父项,我们需要一个子到父查询。我们使用这个关系名称和点记法来获得 Broker__c 对象的 Name(名称)字段。

  1. 在查询编辑器中,把 Broker__c 改成 Broker__c.Name,像这样:
    SELECT Address__c, Picture__c, Broker__c.Name FROM Property__c
  2. 单击执行。(您得到一条错误提示。)
    错误提示
    Didn't understand relationship 'Broker__c' in field path.If you're attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name.(无法理解字段路径中的关系 ”Broker__c”。如果要使用自定义关系,一定要把 ”__r” 加在自定义关系名称后面。

哎呀!发生了什么?记住 Broker__c 是 Property(房产)对象上的一个自定义字段。我们想要的是 Broker__c 相关对象

在查询中使用自定义关系名称

要指定 Broker__c 相关对象(而不是 Broker__c 字段),我们把 __c 改成 __r (两个下划线和 r)。Broker__r 是自定义关系名称。它表示我们想把这个关系从 Property__c 跨越到 Broker__c 对象。查询的这部分表示,获取 Broker__c 自定义对象的名称字段。我们来更新查询。

  1. 在查询编辑器中,把 Broker__c 改成 Broker__r,像这样:
    SELECT Address__c, Picture__c, Broker__r.Name FROM Property__c
  2. 单击执行

    结果的前六行应该是:
    查询结果——总行数:12
    Address__c
    Picture__c
    Broker__r.Name
    18 Henry st
    https://s3-us-west-2.amazonaws.com...
    Caroline Kingsley
    24 Pearl st
    https://s3-us-west-2.amazonaws.com...
    Michael Jones
    72 Francis st
    https://s3-us-west-2.amazonaws.com...
    Jonathan Bradley
    32 Prince st
    https://s3-us-west-2.amazonaws.com...
    Jennifer Wu
    110 Baxter st
    https://s3-us-west-2.amazonaws.com...
    Olivia Green
    448 Hannover St
    https://s3-us-west-2.amazonaws.com...
    Miriam Aupont

好多了。我们现在获得的不是 Id 而是 Broker(经纪人)自定义对象的 Name(名称)字段。

创建父到子查询

我们已经成功返回了带相关经纪人的每处房产。如果我们想要相反的结果,该怎么做呢?

要求:

“获取所有经纪人的名称,带分派给每个经纪人的所有房产的地址和价格。”

因为我们想得到经纪人名单,在我们的主查询中,我们查询 Broker__c 对象:

SELECT Name FROM Broker__c

Broker(经纪人)是父项,所以该父到子查询需要子对象的子查询。我们在子查询中使用子级关系名称。

Property__c 对象的子查询的关系名称是什么?查看 Property(房产)对象上 Broker(经纪人)字段的详细信息。

在 Property(房产)对象的 Broker(经纪人)字段的详细信息页面上,在 Lookup Options(查找选项)下面,Child Relationship Name(子级关系名称)是 Properties(房产)。

“子级关系名称”是 Properties(房产)。因为这是一个自定义关系,当我们在查询中使用它时,加上 __r (Properties__r)。所以我们的子查询(括号中)是这样的:

(SELECT Address__c, Price__c FROM Properties__r)

当我们把这个子查询插入主查询时,完整的查询是这样的:

SELECT Name, (SELECT Address__c, Price__c FROM Properties__r) FROM Broker__c

运行查询

  1. 在查询编辑器中,输入:
    SELECT Name, (SELECT Address__c, Price__c FROM Properties__r) FROM Broker__c
  2. 单击执行
    结果的前八行应该是这样的:

    查询结果共 8 行。第一列是经纪人姓名。第二列是以逗号隔开的房产地址和价格列表。

完美!现在我们已经有了所有经纪人的名单以及用逗号隔开的每个经纪人的房产列表。编写查询时,请记得 Developer Console 的查询编辑器提供了一种简便的方法来测试并调整您的 SOQL 查询。

资源

在 Salesforce 帮助中分享 Trailhead 反馈

我们很想听听您使用 Trailhead 的经验——您现在可以随时从 Salesforce 帮助网站访问新的反馈表单。

了解更多 继续分享反馈