Скрытые стандартные связи между Account, Opportunity и Contact объектами

Если посмотреть на эти три стандартных объекта и связи между ними в «Schema Builder», то увиденное не совсем поддается логике, по которой эти объекты взаимодействуют между собой в реальности. Хотя поведение этих объектов детально описано в документации Salesforce, и если уделить немного времени, то можно найти немало информации по этому поводу. Так как ее даже чересчур много — постараюсь кратко описать все в одном месте.

Account Opportunity Relationship

Как известно, между этими объектами существует связь «Master-detail» и она хорошо описана в документации. Но если посмотреть на поля объекта Opportunity, то мы не увидим связи «Master-detail», только «Lookup».

Что нам позволяет сделать эта связь?

Как «Master-detail»:

  • На объекте Account мы можем создавать «Roll-Up Summary» поля на объект Opportunity;

  • При удалении записи Account, удаляются и все связанные записи Opportunity;

Как «Lookup»:

  • При создании записи Opportunity не обязательно указывать Account как родительский объект;

Account Contact Relationship

Если посмотреть на объекты Account и Contact, то между ними существует «Lookup» связь, которая имеет другую логику поведения.

Как «Master-detail»:

  • При удалении записи Account, удаляются и все связанные записи Contact;

Как «Lookup»:

  • При создании записи Contact не обязательно указывать Account как родительский объект;

  • На объекте Account мы не можем создавать «Roll-Up Summary» поля;

Еще между этими объектами существует изначально скрытая связь “многие ко многим”. Для этого нужно в настройках Account включить Contacts to Multiple Accounts.

При включении этой настройки на Page Layouts обоих объектов можно добавить Related List, Contacts или Accounts. В качестве Junction object выступает AccountContactRelation объект.

AccountContactRelation не видно ни через Object Manager, ни через Schema Builder, но его можно получить через SOQL запрос:

SELECT id, (SELECT ContactId FROM AccountContactRelations) FROM Account

или

SELECT id, (SELECT AccountId FROM AccountContactRelations) FROM Contact

Opportunity Contact Relationship

Предварительно, если посмотреть на поля этих объектов, то между ними нет никакой связи. Но если копнуть глубже, то между ними тоже существует связь “многие ко многим”. Для этого существует Junction object «OpportunityContactRole», то есть, используя стандартные связи, мы можем подвязать Opportunity записи к Contact записям, и наоборот.

Обращаться к объекту можно через SOQL запрос:

SELECT Id, (SELECT ContactId FROM OpportunityContactRoles) FROM Opportunity

или

SELECT Id, (SELECT OpportunityId FROM OpportunityContactRoles) FROM Contact
3 Likes