Допустим, у меня есть идентификатор события, и цель состоит в том, чтобы получить данные о событии и имена всех контактов, связанных с событием, в объекте EventRelation.

В настоящее время я просматриваю запись события с идентификатором события из объекта Event и запускаю отдельный запрос для объекта EventRelation (также с идентификатором события) и для каждой соответствующей строки в EventRelation , найдите идентификатор отношения в объекте Contact, чтобы получить имена контактов.

В основном это много вызовов, можно ли сделать все это в одном запросе?

0
rosghub 15 Ноя 2019 в 00:50
Запросите даже отношение и узнайте о полиморфном soql, чтобы получить родительский контакт
 – 
cropredy
15 Ноя 2019 в 00:53

2 ответа

Лучший ответ

Вы можете использовать запрос отношения:

[SELECT Id, (SELECT Id, Relation.Name FROM EventRelations) FROM Event]

Это вернет события и их отношения, если они есть.

Редактировать:

Обновлено, чтобы добавить пример с информацией об отношении.

0
Nicholas Savini 15 Ноя 2019 в 01:00
Это не будет получать имена контактов
 – 
cropredy
15 Ноя 2019 в 00:59
Да, я только что отредактировал после того, как понял, что пропустил информацию о связи.
 – 
Nicholas Savini
15 Ноя 2019 в 01:00
2
Обратите внимание, что хотя Relation.Name работает, если OP нужен Contact.Email или Contact.Phone, вам нужно будет использовать полиморфный SOQL
 – 
cropredy
15 Ноя 2019 в 01:01
Это, кажется, работает хорошо. Как понять, что Relation.Name — это то, что нужно? Я попытался выполнить описание объекта EventRelation, но дочерних отношений не было.
 – 
rosghub
15 Ноя 2019 в 02:41
В документации вы Вы обнаружите, что имя поля отношения для Event Relation — RelationId. При использовании запросов на отношения имя отношения для стандартного поля будет именем поля без идентификатора. Если бы это было пользовательское отношение, вам нужно было бы добавить «__r» в конец (т.е. Custom_Field__r). Подробнее здесь.
 – 
Nicholas Savini
15 Ноя 2019 в 02:54

Вы можете использовать запросы отношений, такие как:

Для Обычных полей поиска:

SELECT Amount, Id, Name, (SELECT Quantity, ListPrice,
  PriceBookEntry.UnitPrice, PricebookEntry.Name,
  PricebookEntry.product2.Family FROM OpportunityLineItems)
  FROM Opportunity

Для Полей полиморфного поиска:

SELECT 
  TYPEOF What
    WHEN Account THEN Phone, NumberOfEmployees
    WHEN Opportunity THEN Amount, CloseDate
    ELSE Name, Email
  END
FROM Event WHERE WHAT.TYPE in ('Account','Opportunity')

Далее в коде Apex:

List<Event> allEvs = [SELECT id,custom_field1,
  TYPEOF What
    WHEN Account THEN Phone, NumberOfEmployees
    WHEN Opportunity THEN Amount, CloseDate
    ELSE Name, Email
  END
FROM Event WHERE WHAT.TYPE in ('Account','Opportunity')];
for (Event ev: allEvs) {
    if (ev.What instanceof Account) {
        Account acc = ev.What;
        System.debug('--acc--->'+ev.NumberOfEmployees);
    } else if (ev.What instanceof Opportunity) {
        Opportunity opp = ev.What;
        System.debug('--opp--->'+ev.CloseDate);
    }
}
0
Deepak sharma 7 Апр 2021 в 11:32
Этот ответ в принципе правильный, но он был бы сильнее, если бы он был непосредственно связан с этим вопросом, касающимся Событий, Отношений Событий и Контактов.
 – 
David Reed
7 Апр 2021 в 16:05
Вот мысль, если кто-то может опубликовать вопрос на StackExchange, то я считаю, что тот же человек может понять и решение. И если кто-то не может тогда понять логику или объяснение из ответа, то ему следует прекратить искать ответ.
 – 
Deepak sharma
26 Апр 2021 в 09:32