2

I have a related list on my Contracts for Orders. I am querying for certain contracts, and I want to Select ID, startdate, and some other fields, along with its corresponding related list of orders. I've seen some code for grabbing related lists, but I can't seem to find what the list API name is, or correct syntax from other forums for something to work. Can somebody step me through this, starting from where I find the related list API name? I think I recall going to 'fields' one time in the past and seeing other relationships there, but not in this case now.

update:

enter image description here

4

You can always find the child relationship name by going through the DescribeSObjectResult on your parent object.

DescribeSObjectResult describe = SObjectType.Contract;
for (ChildRelationship relation : describe.getChildRelationships())
{
    system.debug(relation);
}

You can just filter this debug log for Order (case-sensitive) and you will find the relationship you are looking for. You want the value in getRelationshipName.

If you wanted to use the Contract and Order standard objects, you would do:

for (ChildRelationship relation : SObjectType.Contract.getRelationships())
    if (relation.childSObject() == Order.sObjectType)
        system.debug(relation.getRelationshipName());

If that script outputs Orders, then you would do:

List<Contract> contractsWithOrders = [
    SELECT StartDate, (SELECT Id FROM Orders)
    FROM Contract WHERE ...
];
| improve this answer | |
  • Thanks! I found the relationship name. It is "Orders", which is what I used in my query before (Orders__r) from another source, and it didn't seem syntactically correct. Now that I have this part verified, how do I go about querying for it when querying for contracts? – Natalie Spatharakis Feb 7 '17 at 17:31
  • What do contracts have to do with orders? – Adrian Larson Feb 7 '17 at 17:32
  • See question: I have a related list on my Contracts for Orders I am trying to pull this related list along with other fields on the Contracts I'm querying – Natalie Spatharakis Feb 7 '17 at 17:33
  • @NatalieSpatharakis - No __r, I was incorrect in my previous edit. Simply use From Orders in the subquery. To tell you exactly, we will need to see some code or better understand what you are trying to query – Eric Feb 7 '17 at 17:33
  • That's what I'm trying to find out, how to do a "subquery". I do not understand how to pull a related list from an object in a query – Natalie Spatharakis Feb 7 '17 at 17:35
3

Declarative (Standard Order Object)

  1. Setup
  2. Customize
  3. Orders
  4. Click on the field that is the lookup to the Contract
  5. Look at the Child Relationship name

For code see Adrian's answer

An example query

[
 Select Id, ....., 
    (Select Id, ...... From Orders) 
 From Contract
]
| improve this answer | |
  • Caveat that this approach doesn't provide the namespace. – Adrian Larson Feb 7 '17 at 17:17
  • There is no "Orders" under customize -- see edited question for screenshot. Thoughts? – Natalie Spatharakis Feb 7 '17 at 17:28
  • @NatalieSpatharakis Is orders a custom object Orders__c If so goto Create -> Objects. Also, the list under customize is not in alphabetical order. you can type Order in the search box to find it if not custom – Eric Feb 7 '17 at 17:31
  • Orders are standard objects – Natalie Spatharakis Feb 7 '17 at 17:33
  • Then it will be under the customize list. In my org is is right under Contracts – Eric Feb 7 '17 at 17:34
0

You can use Schema describe to get all of the child relationship API names:

String[] sObjTypes = new String[]{'Contract'};
Schema.DescribeSObjectResult[] describeSObjResults = Schema.describeSObjects(sObjTypes);
for(Schema.DescribeSObjectResult dsr : describeSObjResults) {
    for(Schema.ChildRelationship cr : dsr.getChildRelationships()) {
        system.debug( 'sObject: ' + dsr.getName() + ' - Child Relationship API Name: ' + cr.getRelationshipName());
    }
}

Then to for the subquery to grab all related Orders to contracts:

[SELECT Id, (SELECT Id FROM Orders) FROM Contract]
| improve this answer | |
  • 1
    Appreciate the effort but the answer does not provide anything additional to what Adrian posted. It actually adds unnecessary code. If you feel it adds to the previous answer can you please clarify the benefits of the additional code – Eric Feb 7 '17 at 17:36
  • I felt it would be useful to know you could get the describe information for multiple sObjects at the same time. Also, it doesn't sound like the OP is planning on actually using this in code, rather just to retrieve the API names as needed. I didn't see the latest edits from Adrian's post, I can remove my post if its not useful. – Bob Lopez Feb 7 '17 at 17:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.