Criar consultas de relacionamento com objetos padrão
Objetivos de aprendizagem
Após concluir esta unidade, você estará apto a:
- Descrever dois tipos de consulta de relacionamento.
- Identificar o relacionamento entre dois objetos.
- Criar uma consulta filho para pai usando notação de ponto.
- Criar uma consulta pai para filho usando uma subconsulta.
- Usar uma subconsulta para filtrar os resultados da consulta.
Acompanhar com o Trail Together
Deseja acompanhar um especialista enquanto trabalha nesta etapa? Veja este vídeo que faz parte da série Trail Together no Trailhead Live.
(Este clipe começa na marca dos 36:18 minutos, caso você queira retroceder e ver o início da etapa novamente.)
Sobre as consultas de relacionamento
Como administrador do Salesforce, você já está familiarizado com campos de fórmula que extraem dados de registros relacionados. Agora você pode aplicar seu conhecimento sobre relacionamentos entre objetos para escrever consultas SOQL.
Embora a cláusula FROM esteja limitada a um objeto, podemos acessar dois objetos relacionados usando uma consulta de relacionamento. Uma consulta de relacionamento baseia-se na relação entre dois objetos diferentes para retornar campos de ambos os objetos. Pense nisso como uma consulta entre objetos.
Considere este requisito:
“Obter uma lista de todos os contatos com o nome da conta de cada contato.”
Podemos consultar o objeto Contato, mas ele não tem um campo Nome da conta. O nome da conta é, na verdade, o campo Nome na conta que está relacionada ao contato. Em uma organização, você usa um campo de fórmula para acessar um campo em qualquer objeto relacionado. No Apex, você usa uma consulta de relacionamento, mas o tipo de consulta de relacionamento depende de como os dois objetos estão relacionados.
Para obter registros de um:
- Objeto filho e incluir campos de um objeto pai relacionado, use uma consulta filho para pai .
- Objeto pai e incluir campos de um objeto filho relacionado, use uma consulta pai para filho .
Antes de podermos decidir que tipo de consulta usar, precisamos saber como nossos dois objetos, Contato e Conta, estão relacionados. Qual é o pai e qual é o filho?
Identificar o relacionamento entre objetos
Como administrador, você está familiarizado com relacionamentos entre mestre e detalhes em uma organização. Um relacionamento entre mestre e detalhes é uma relação pai para filho. O objeto principal é o pai e o objeto de detalhe é o filho. Se os dois objetos que devem ser incluídos em uma consulta têm um relacionamento entre mestre e detalhes, você sabe qual é o pai e qual é o filho.
Se você não está familiarizado com os dois objetos que deseja incluir em uma consulta, ou não sabe como eles estão relacionados, explore os objetos no Gerenciador de objetos. Comece com o objeto que mais provavelmente é o filho e olhe para seus Campos e relacionamentos. Encontre um nome de campo que possa se conectar ao objeto pai.
Por exemplo, o Contato tem um campo AccountId com o tipo de dados Pesquisa(Conta). Lembre-se, no código precisamos do nome de campo (AccountId), não do rótulo de campo (Nome da conta).
Nos detalhes para o campo AccountId, o Nome do relacionamento filho é Contatos, plural. Por padrão, o nome do relacionamento para objetos padrão é a forma plural do nome do objeto filho.
O Nome do relacionamento filho confirma que o Contato é filho de Conta. Também nos dá o nome do relacionamento de que precisamos para uma consulta pai para filho (que abordaremos mais tarde nesta unidade).
Criar uma consulta filho para pai
Agora sabemos que o Contato e a Conta têm um relacionamento de filho para pai. O contato é o filho e Conta é o pai. Para retornar todos os contatos (filhos) e o nome da conta (pai) de cada contato, precisamos de uma consulta filho para pai.
Em uma consulta filho para pai, consulte o objeto filho e obtenha campos de um objeto pai usando notação de ponto, desta forma:
SELECT Name, Account.Name FROM Contact
Essa instrução SELECT consulta o objeto Contato. Na cláusula SELECT, Name
é o campo Nome do contato e Account.Name
é o campo Nome da conta que está relacionada ao contato.
Executar uma consulta filho para pai
- No Editor de consulta do Developer Console, digite:
SELECT Name, Account.Name FROM Contact
- Clique em Executar.
As primeiras seis linhas dos resultados devem ser:
Resultados da consulta - Total de linhas: 20 |
|
Nome |
Account.Name |
Rose Gonzales |
Edge Communications |
Sean Forbes |
Edge Communications |
Jack Rogers |
Burlington Textiles Corp of America |
Pat Stumuller |
Pyramid Construction Inc. |
Andy Young |
Dickenson plc |
Tim Barr |
Grand Hotels & Resorts Ltd |
A segunda coluna mostra o nome da conta do objeto Conta pai do contato.
Criar uma consulta pai para filho
Agora vamos ver como consultar um objeto pai e obter campos de seu objeto filho. Em uma consulta pai para filho, usamos uma subconsulta para obter campos do objeto filho. Uma subconsulta é uma instrução SELECT incluída entre parênteses e aninhada dentro de outra consulta.
Suponha que nosso requisito seja:
"Para cada conta, retornar o nome da conta e o nome de cada contato relacionado."
Quando lemos "de cada relacionado", sabemos que precisamos de uma consulta de relacionamento. Como Contato é um filho de Conta, precisamos de uma consulta de relacionamento pai para filho, que contém uma subconsulta do objeto filho.
A primeira parte do requisito, "Para cada conta, retornar o nome da conta" torna-se a consulta principal, que forma a parte externa da consulta completa. A segunda parte do requisito, "o nome de cada contato relacionado" torna-se a subconsulta, a consulta interna aninhada dentro da consulta principal.
Primeiro, definimos a consulta principal: SELECT Name FROM Account
Em seguida, definimos a subconsulta entre parênteses: (SELECT Name FROM Contact)
Posicionamos a subconsulta como se fosse o segundo campo na consulta principal. Adicionamos uma vírgula após Name e depois inserimos a subconsulta, desta forma:
Em uma subconsulta, em vez do nome de campo do objeto relacionado, usamos o nome do relacionamento filho. Então, como etapa final, mudamos a subconsulta para usar o nome de relacionamento filho Contatos
, em vez do nome de objeto Contato
, desta forma:
Essa consulta retorna o nome da conta e todos os nomes de contato para todas as contas. Vamos entender isso melhor.
A consulta é executada em três partes:
- A consulta seleciona uma conta e recebe o campo Nome da conta. Essa é a consulta principal (a consulta externa).
- Em seguida, a consulta analisa os contatos relacionados da conta e recebe o campo Nome de cada contato. Essa é a subconsulta (a consulta interna).
- Em seguida, ela passa para a próxima conta e repete o processo até ter selecionado todas as contas.
Executar a consulta pai para filho
- No Editor de consultas, digite o seguinte:
SELECT Name, (SELECT Name FROM Contacts) FROM Account
- Clique em Executar.
As primeiras seis linhas de seus resultados devem ser assim:
Resultados da consulta - Total de linhas: 12 |
|
Nome |
Contatos |
Edge Communications |
[{"Name":"Rose Gonzalez"},{"Name":"Sean Forbes"}] |
Burlington Textiles Corp of America |
[{"Name":"Jack Rogers"}] |
Pyramid Construction Inc. |
[{"Name":"Pat Stumuller"}] |
Dickenson plc |
[{"Name":"Andy Young"}] |
Grand Hotels & Resorts Ltd |
[{"Name":"John Bond"},{"Name":"Tim Barr"}] |
United Oil & Gas Corp. |
[{"Name":"Arthur Song"},{"Name":"Avi Green"},{"Name":"Lauren Boyle"},{"Name":"Stella Pavlova"}] |
Interessante! A janela Resultados da consulta exibe nomes de contas e uma coleção de registros de contato filho associados a cada conta. Esse tipo de coleção provavelmente parece familiar porque discutimos mapas no módulo Programação orientada a objetos para administradores.
Se você não se lembra do que é um mapa, não se preocupe. Vamos recapitular. Uma coleção de mapas contém pares de chave-valor separados por vírgulas. A chave é o nome de campo, como Nome. A chave é seguida por seu valor, como Jake Llorrac. Os pares de chave-valor são devolvidos pela instrução SELECT aninhada que consulta os contatos relacionados à conta.
Filtragem com uma subconsulta
Digamos que só queremos contas que tenham um contato relacionado ao sobrenome Forbes. Isso é complicado porque queremos filtrar o objeto pai, Conta, por um valor no objeto filho, Contato. Da mesma forma que aninhamos uma subconsulta dentro da consulta principal, podemos usar uma subconsulta (do objeto filho) na cláusula WHERE da consulta principal. Os resultados da subconsulta agem como um filtro para a consulta principal. Se você estiver familiarizado com filtros cruzados, adicionar a cláusula WHERE à subconsulta equivale ao uso de um filtro cruzado em um relatório.
Começamos com a consulta existente:SELECT Name, (SELECT Name FROM Contacts) FROM Account
Em seguida, precisamos de uma subconsulta que obtenha o campo AccountId de contatos que tenham o sobrenome Forbes:
(SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
Você deve estar se perguntando por que precisamos do campo AccountId do contato. Verificamos o campo AccountId do contato para encontrar contatos relacionados a uma conta. Um contato está relacionado a uma conta quando o campo AccountId no objeto Contato e o campo Id no objeto Conta têm o mesmo valor (Contact.AccountId = Account.Id
). Assim, consultamos o objeto Contato e retornamos seu valor AccountId. Para selecionar a conta que está relacionada ao contato, encontramos a conta que tem esse valor em seu campo Id.
Finalmente, adicionamos uma cláusula WHERE à consulta principal. Queremos selecionar um registro de conta somente se seu Id for encontrado no campo AccountId de um Contato retornado pela subconsulta. Assim, adicionamos WHERE Id IN
seguido pela subconsulta, assim:
SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
Essa consulta faz quatro coisas.
- Ela encontra contatos com o sobrenome Forbes e retorna o valor do campo AccountId de cada contato. (A subconsulta da cláusula WHERE faz isso.)
- Em seguida, ela encontra o valor desse AccountId no campo Id de uma conta e recebe o nome dessa conta. (A cláusula WHERE principal faz isso.)
- Em seguida, a consulta olha os contatos relacionados da conta e obtém o nome de cada contato. (A subconsulta da consulta principal faz isso.)
- Finalmente, a consulta principal retorna o nome de cada conta que tenha um contato relacionado com o sobrenome Forbes e, para cada uma dessas contas, os nomes de todos os contatos relacionados.
Executar a consulta filtrada
- No Editor de consultas, digite o seguinte:
SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
- Clique em Executar.
Os resultados devem ficar assim:
Resumo
Agora você sabe como escolher e criar o tipo certo de consulta de relacionamento para objetos padrão. Na próxima unidade, você aprenderá a fazer consultas de relacionamento para objetos personalizados.