איך למשוך נתונים משדות משורשרים ב-SOQL מתוך מפה

ליאור נכתב על ידי ליאור לביא, עודכן בתאריך 24/08/2021

אם קראת את הפוסט פה באתר "איך לבצע שמירת נתונים משאילתות SOQL בצורה יעילה יותר", סביר להניח שהתחלת להשתמש במשתנים מסוג Map כדי לשמור תוצאות של שאילתות. לשמירת תוצאות לתוך מפה יש יתרונות ברורים, אבל עכשיו נתקלת בבעיה: השאילתה שלך מכילה שדות משורשרים, ואתה לא בטוח איך למשוך את הנתונים מהשדות המשורשרים ולשמור אותם למשתנים.

כדי להבין את הבעיה בצורה יותר ברורה, בוא נסתכל על הדוגמה הבאה:

ראשית נשמור את השאילתה שלנו ל-Map:

Map<Id, myCustomObjectA__c> allMyCustomRecords = new Map<Id, myCustomObjectA__c>([SELECT Id, CustomObjectB__c, CustomObjectB__r.Name, Account]);

עכשיו, אם היינו רוצים לשלוף את ה-ID מהשדה CustomObjectB__c כל שהינו צריכים לעשות הוא לספק את ה-ID של הרשומה המבוקשת למתודה get של ה-Map באופן הבא:

allMyCustomRecords.get('myRecordID').CustomObjectB__c

אבל מה אם היינו רוצים להחזיר את השם של ה-CustomObjectB? הצורה באה לא תעבוד ובמקום זאת תוצג עבורנו הודעת שגיאה:

allMyCustomRecords.get('myRecordID').CustomObjectB__r.Name

הצורה הנכונה היא לשליפת השדה המשורשר Name היא כך:

allMyCustomRecords.get('myRecordID').getSObject('CustomObjectB__r').get('Name');

או בצורה כללית יותר:

Map.get(id).getSObject('FieldName__r').get('FieldName__c')

שים לב!
הדוגמה למעלה מתייחסת למקרה בו האובייקט ממנו נרצה למשוך את השדה המשורשר הוא אובייקט שיצרנו בעצמנו בסביבה, אובייקט Custom, ולא Standard של הפלטפורמה כמו Account או User. במקרה של אובייקט סטנדרטי נשתמש במבנה הבא:

 Map.get(id).getSObject('FieldName').get('FieldName')

לדוגמה:

allMyCustomRecords.get('myRecordID').getSObject('Account').get('Name');