用自定义对象创建关系查询
学习目标
完成本单元后,您将能够:
- 解释方案生成器中的图表以识别对象关系。
- 识别在自定义对象查询中使用的自定义关系名称。
- 为自定义对象创建子到父查询。
- 为自定义对象创建父到子查询。
跟随 Trail Together 进行学习
进行这一步骤时,想要跟随专家一起学习吗?查看此视频,它是 Trailhead Live 上 Trail Together 系列的一部分。
(此视频片段从 51:38 开始,如果您想要倒回去再次观看步骤的开头部分可以从这里开始。)
启动您的 Trailhead Playground 并安装软件包
本模块剩余部分的示例和实践活动以一个房地产应用程序 DreamHouse 为例。我们开始在您的 Trailhead Playground 中安装这个应用程序并导入样本数据吧。
如果还没有打开 Trailhead Playground,请先启动。如果在组织中看到标有“安装软件包”的选项卡,那就太好了。跳过去,直接去步骤 1。如果没看到,请从应用程序启动器 () 中找到并打开 Playground Starter,然后按照相应步骤操作。如果您没有看到 Playground Starter 应用,请复制这个 Dreamhouse 安装包的链接并查看 Trailhead 帮助中的安装软件包或应用程序,完成 Trailhead 挑战。
- 单击安装软件包选项卡。
- 将
04t3h000004mBpiAAE
粘贴到相应字段中。 - 单击安装。
- 选择仅为管理员安装,之后单击安装。
- 如果弹出提示要批准第三方访问权限,请选择是的,授予访问……,然后单击继续。
软件包安装完成后,您会看到一个确认页面,并会收到一封发送至 Playground 关联邮箱地址的电子邮件。
导入 DreamHouse 数据
- 单击 ,在搜索框中输入
Dream
,然后选择 DreamHouse 应用程序。 - 单击设置选项卡。(如果没看到“设置”选项卡,请展开更多列表。)
- 单击导入数据。
- 单击 Properties(房产)选项卡,熟悉样本数据。
探索 DreamHouse 方案
到目前为止,我们只查询了标准对象。现在我们讨论如何查询自定义对象。我们使用 DreamHouse 应用程序中的对象,因此我们首先要检查 DreamHouse 方案(数据模型),以了解数据的结构是怎样的。
打开方案生成器
- 在 Trailhead Playground 中,单击 并选择设置。
- 单击对象管理器。
- 单击方案生成器。
- 在“对象”选项卡中,单击清除所有。
- 如果您看到的是 Broker 而不是 Broker__c,请单击查看选项,然后选择显示元素名称。
-
记住在代码中我们使用字段 API 名称。“显示元素名称”向我们显示字段 API 名称而不是字段标签。(自定义对象的 API 名称是末尾添加了 __c [两个下划线和 c] 的自定义对象名称。)
- 在“从下面选择”列表中,选择自定义对象。
- 选择 Broker__c 和 Property__c。我们在本单元中会用到这两个自定义对象。
- 单击自动布局。
- 检查房产字段。
-
Property__c 自定义对象有两个自定义字段:Picture__c 和 Broker__c。(自定义字段的 API 名称是末尾添加了 __c [两个下划线和 c] 的自定义字段名称。)
- 把鼠标悬停在关联 Property__c 与 Broker__c 的关联线上方。
-
从 Property__c 自定义对象上的 Broker__c 自定义字段,有一个到 Broker__c 自定义对象的查找关系。
- 在 Property__c 元素上,单击齿轮图标,然后选择查看对象。
对象管理器打开,显示 Property__c 对象。 - 单击字段和关系。
- 单击 Broker(经纪人)字段标签。
- 在“查找选项”中,找到“子级关系名称”。
现在我们知道 Property__c 是 Broker__c 的一个子项,房产与经纪人之间的关系名称是 Properties。(记住,这个关系名称通常是子对象名称的复数形式。)
查询自定义对象
查询自定义对象跟查询标准对象很像,只有几点不同。
考虑这项要求:
“获得所有房产的列表,带房产地址、图片以及指定经纪人。”
非常直接,对吧?我们查询 Property__c 自定义对象,获得 Address__c、Picture__c 和 Broker__c 自定义字段。我们来试一试。
创建查询
- 在查询编辑器中,输入:
SELECT Address__c, Picture__c, Broker__c FROM Property__c
- 单击执行。
结果的前六行应该是:查询结果——总行数: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(名称)字段。
- 在查询编辑器中,把 Broker__c 改成 Broker__c.Name,像这样:
SELECT Address__c, Picture__c, Broker__c.Name FROM Property__c
- 单击执行。(您得到一条错误提示。)
错误提示
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 自定义对象的名称字段。我们来更新查询。
- 在查询编辑器中,把
Broker__c
改成Broker__r
,像这样:SELECT Address__c, Picture__c, Broker__r.Name FROM Property__c
- 单击执行。
结果的前六行应该是:查询结果——总行数: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(经纪人)字段的详细信息。
“子级关系名称”是 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
运行查询
- 在查询编辑器中,输入:
SELECT Name, (SELECT Address__c, Price__c FROM Properties__r) FROM Broker__c
- 单击执行。
结果的前八行应该是这样的:
完美!现在我们已经有了所有经纪人的名单以及用逗号隔开的每个经纪人的房产列表。编写查询时,请记得 Developer Console 的查询编辑器提供了一种简便的方法来测试并调整您的 SOQL 查询。