Erstellen von Beziehungsabfragen mit Standardobjekten
Lernziele
Nachdem Sie diese Lektion abgeschlossen haben, sind Sie in der Lage, die folgenden Aufgaben auszuführen:
- Beschreiben der beiden Typen von Beziehungsabfragen
- Bestimmen der Beziehung zwischen zwei Objekten
- Erstellen einer Abfrage einer Unter-/Überordnungsbeziehung mithilfe der Punktnotation
- Erstellen einer Abfrage einer Über-/Unterordnungsbeziehung mithilfe einer Unterabfrage
- Filtern von Abfrageergebnissen mit einer Unterabfrage
Mit Trail Together einem Dozenten folgen
Möchten Sie bei diesem Schritt einem Experten folgen? Schauen Sie sich dieses Video an, das Teil der Reihe "Trail Together" auf Trailhead Live ist.
(Dieser Clip beginnt bei Minute 36:18, für den Fall, dass Sie zurückspringen und den Anfang des Schritts noch einmal sehen möchten.)
Informationen zu Beziehungsabfragen
Als Salesforce-Administrator sind Sie bereits mit Formelfeldern vertraut, die Daten aus verwandten Datensätzen abrufen. Jetzt können Sie Ihr Wissen über Objektbeziehungen auf das Schreiben von SOQL-Abfragen anwenden.
Obwohl die FROM-Klausel auf ein Objekt begrenzt ist, können wir mit einer Beziehungsabfrage auf zwei verwandte Objekte zugreifen. Eine Beziehungsabfrage nutzt die Beziehung zwischen zwei verschiedenen Objekten, um Felder aus beiden Objekten zurückzugeben. Sie können sich das wie eine objektübergreifende Abfrage vorstellen.
Sehen wir uns diese Anforderung an:
"Eine Liste aller Kontakte mit dem Accountnamen der einzelnen Kontakte abrufen."
Wir können das Objekt "Kontakt" abfragen, aber es enthält nicht das Feld "Accountname". Der Accountname ist tatsächlich das Feld "Name" im Account, der mit dem Kontakt verknüpft ist. In einer Organisation greifen Sie mithilfe eines Formelfelds auf ein Feld in einem beliebigen verwandten Objekt zu. In Apex arbeiten Sie mit einer Beziehungsabfrage, aber deren Typ hängt davon ab, in welcher Beziehung die beiden Objekte zueinander stehen.
Zum Abrufen von Datensätzen für ein
- untergeordnetes Objekt und Einbeziehen von Feldern aus einem verwandten übergeordneten Objekt verwenden Sie eine Abfrage einer Unter-/Überordnungsbeziehung.
- übergeordnetes Objekt und Einbeziehen von Feldern aus einem verwandten untergeordneten Objekt verwenden Sie eine Abfrage einer Über-/Unterordnungsbeziehung.
Ehe wir entscheiden können, welchen Abfragetyp wir wählen, müssen wir wissen, in welcher Beziehung unsere beiden Objekte, "Kontakt" und "Account", zueinander stehen. Welches ist über- und welches untergeordnet?
Bestimmen der Beziehung der Objekte
Als Administrator sind Sie mit Master-Detail-Beziehungen in einer Organisation vertraut. Eine Master-Detail-Beziehungen ist eine Über-/Unterordnungsbeziehung. Das Master-Objekt ist das übergeordnete, das Detail-Objekt das untergeordnete Objekt. Wenn die beiden Objekte, die Sie in eine Abfrage einbeziehen möchten, eine Master-Detail-Beziehung haben, wissen Sie, welches das übergeordnete und welches das untergeordnete Objekt ist.
Wenn Sie mit den beiden Objekten, die Sie in eine Abfrage einbeziehen möchten, nicht vertraut sind oder nicht wissen, in welcher Beziehung sie stehen, erkunden Sie die Objekte im Objekt-Manager. Beginnen Sie mit dem Objekt, bei dem die Wahrscheinlichkeit am größten ist, dass es sich um das untergeordnete Objekt handelt, und sehen Sie sich dessen Feld "Felder & Beziehungen" an. Suchen Sie einen Feldnamen, der mit dem übergeordneten Objekt verbunden sein könnte.
"Contact" enthält z. B. das Feld "AccountId" mit dem Datentyp "Lookup(Account)". Denken Sie daran, dass wir im Code den Feldnamen (AccountId) benötigen, nicht die Feldbezeichnung (Accountname).
In den Details des Felds "AccountId" lautet der Name der untergeordneten Beziehung "Contacts" (im Plural). Standardmäßig ist der Beziehungsname für Standardobjekte die Pluralform des Namens des untergeordneten Objekts.
"Name der untergeordneten Beziehung" bestätigt, dass "Contact" ein untergeordnetes Objekt von "Account" ist. Er liefert uns auch den Beziehungsnamen, den wir für eine Abfrage der Über-/Unterordnungsbeziehung benötigen (die wir im weiteren Verlauf dieser Einheit behandeln).
Erstellen einer Abfrage einer Unter-/Überordnungsbeziehung
Jetzt wissen wir, dass "Contact" und "Account" in einer Unter-/Überordnungsbeziehung zueinander stehen. "Contact" ist das untergeordnete, "Account" das übergeordnete Objekt. Um alle (untergeordneten) Kontakte und den Namen des (übergeordneten) Accounts eines jeden Kontakts zurückzugeben, benötigen wir eine Abfrage der Unter-/Überordnungsbeziehung.
Bei einer Abfrage der Unter-/Überordnungsbeziehung fragen Sie das untergeordnete Objekt ab und erhalten Felder eines übergeordneten Objekts, indem Sie die Punktnotation wie folgt nutzen:
SELECT Name, Account.Name FROM Contact
Diese SELECT-Anweisung fragt das Objekt "Contact" ab. In der SELECT-Klausel ist Name
das Feld "Name" des Kontakts und Account.Name
das Feld "Name" des Accounts, der mit dem Kontakt verknüpft ist.
Ausführen der Abfrage einer Unter-/Überordnungsbeziehung
- Geben Sie in der Developer Console im Query Editor Folgendes ein:
SELECT Name, Account.Name FROM Contact
- Klicken Sie auf Execute (Ausführen).
Die ersten sechs Zeilen Ihrer Ergebnisse sollten wie folgt lauten:
Abfrageergebnis – Zeilen insgesamt: 20 |
|
Name |
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 |
Die zweite Spalte enthält den Accountnamen aus dem übergeordneten Objekt "Account" des Kontakts.
Erstellen einer Abfrage einer Über-/Unterordnungsbeziehung
Nun wollen wir uns ansehen, wie ein übergeordnetes Objekt abgefragt werden kann, um Felder aus seinem untergeordneten Objekt abzurufen. Bei einer Abfrage der Über-/Unterordnungsbeziehung rufen wir mithilfe einer Unterabfrage Felder aus dem untergeordneten Objekt ab. Eine Unterabfrage ist eine in Klammern eingeschlossene SELECT-Anweisung, die in einer anderen Abfrage geschachtelt ist.
Angenommen, unsere Anforderung lautet wie folgt:
"Für jeden Account den Accountnamen und den Namen jedes zugehörigen Kontakts zurückgeben."
Wenn wir "jeden zugehörigen" lesen, wissen wir, dass wir eine Beziehungsabfrage benötigen. Da "Contact" ein untergeordnetes Objekt von Account ist, benötigen wir eine Abfrage der Über-/Unterordnungsbeziehung, die eine Unterabfrage des untergeordneten Objekts enthält.
Der erste Teil der Anforderung, "Den Account für Accountnamen zurückgeben", wird zur Hauptabfrage, die den äußeren Teil der vollständigen Abfrage bildet. Der zweite Teil der Anforderung, "den Namen jedes zugehörigen Kontakts" wird zur Unterabfrage, der inneren Abfrage, die in der Hauptabfrage geschachtelt ist.
Zunächst definieren wir die Hauptabfrage: SELECT Name FROM Account
Als Nächstes definieren wir die Unterabfrage in Klammern: (SELECT Name FROM Contact)
Dann positionieren wir die Unterabfrage so, als wäre sie das zweite Feld in der Hauptabfrage. Wir fügen ein Komma hinter Name und dann die Unterabfrage wie folgt ein:
Innerhalb einer Unterabfrage verwenden wir anstelle des Feldnamens des verwandten Objekts den Namen der untergeordneten Beziehung. Im letzten Schritt ändern wir die Unterabfrage so, dass sie den Namen der untergeordneten Beziehung Contacts
anstelle des Objektnamens Contact
verwendet, etwa so:
Diese Abfrage gibt den Accountnamen und alle Kontaktnamen für alle Accounts zurück. Sehen wir uns das im Einzelnen an.
Diese Abfrage besteht aus drei Teilen:
- Die Abfrage wählt einen Account aus und ruft das Feld "Accountname" ab. Dies ist die Hauptabfrage (die äußere Abfrage).
- Als Nächstes prüft die Abfrage die mit dem Account verknüpften Kontakte und ruft für jeden das Feld "Name" ab. Dies ist die Unterabfrage (die innere Abfrage).
- Dann wird der nächste Account ausgewählt und der Vorgang wiederholt, bis alle Accounts ausgewählt wurden.
Ausführen der Abfrage einer Über-/Unterordnungsbeziehung
- Geben Sie im Query Editor Folgendes ein:
SELECT Name, (SELECT Name FROM Contacts) FROM Account
- Klicken Sie auf Execute (Ausführen).
Die ersten sechs Zeilen Ihrer Ergebnisse sollten wie folgt lauten:
Abfrageergebnis – Zeilen insgesamt: 12 |
|
Name |
Kontakte |
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"}] |
Sehr interessant! Im Fenster mit den Ergebnissen der Abfrage werden die Accountnamen und eine Sammlung untergeordneter Kontaktdatensätze angezeigt, die mit jedem Account verknüpft sind. Diese Art der Sammlung kommt Ihnen wahrscheinlich bekannt vor, da wir Zuordnungen im Modul Objektorientierte Programmierung für Administratoren behandelt haben.
Falls Sie nicht mehr wissen, was eine Zuordnung ist, keine Sorge, wir gehen das Ganze noch einmal durch. Eine Sammlung von Zuordnungen enthält durch Komma getrennte Schlüssel-Werte-Paare. Der Schlüssel ist der Feldname, z. B. "Name". Auf den Schlüssel folgt sein Wert, z. B. Jake Llorrac. Die Schlüssel-Wert-Paare werden von der geschachtelten SELECT-Anweisung zurückgegeben, die die mit dem Account verknüpften Kontakte abfragt.
Filtern mithilfe einer Unterabfrage
Angenommen, wir suchen nur Accounts, die einen zugehörigen Kontakt mit dem Nachnamen "Forbes" haben. Das ist knifflig, denn wir möchten das übergeordnete Objekt, Account, nach einem Wert im untergeordneten Objekt, Contact, filtern. So wie wir eine Unterabfrage in der Hauptabfrage geschachtelt haben, können wir eine Unterabfrage (des untergeordneten Objekts) in der WHERE-Klausel der Hauptabfrage verwenden. Die Ergebnisse der Unterabfrage fungieren wie ein Filter für die Hauptabfrage. Wenn Sie mit Kreuzfiltern vertraut sind, entspricht das Hinzufügen der WHERE-Klausel in der Unterabfrage der Verwendung eines Kreuzfilters in einem Bericht.
Wir beginnen mit unserer bestehenden Abfrage:SELECT Name, (SELECT Name FROM Contacts) FROM Account
Als Nächstes benötigen wir eine Unterabfrage, die das Feld "AccountId" von Kontakten mit dem Nachnamen "Forbes" abruft:
(SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
Sie werden sich fragen, warum wir das Feld "AccountId" des Kontakts benötigen. Wir prüfen das Feld "AccountId" des Kontakts auf Kontakte, die mit einem Account verknüpft sind. Ein Kontakt ist mit einem Account verknüpft, wenn das Feld "AccountId" im Objekt "Contact" und das Feld "Id" im Objekt "Account" denselben Wert haben (Contact.AccountId = Account.Id
). Daher fragen wir das Objekt "Contact" ab und geben dessen Wert für "AccountId" zurück. Um den Account auszuwählen, der mit dem Kontakt verknüpft ist, suchen wir den Account, der diesen Wert in seinem Feld "Id" aufweist.
Schließlich fügen wir der Hauptabfrage eine WHERE-Klausel hinzu. Wir möchten einen Accountdatensatz nur auswählen, wenn seine ID im Feld "AccountId" eines von der Unterabfrage zurückgegebenen Kontakts enthalten ist. Deshalb fügen wir WHERE Id IN
hinzu, gefolgt von der Unterabfrage, etwa so:
SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
Diese Abfrage dient also vier Zwecken.
- Die Abfrage findet Kontakte mit dem Nachnamen "Forbes" und gibt den Wert des Felds "AccountId" aller Kontakte zurück. (Dies übernimmt die Unterabfrage in der WHERE-Klausel.)
- Als Nächstes findet sie den Wert dieser "AccountId" im Feld "Id" eines Accounts und ruft den Namen dieses Accounts ab. (Dies übernimmt die WHERE-Klausel.)
- Dann prüft die Abfrage die mit dem Account verknüpften Kontakte und ruft den Namen jedes Kontakts ab. (Dies übernimmt die Unterabfrage der Hauptabfrage.)
- Schließlich gibt die Hauptabfrage den Namen jedes Accounts zurück, der einen zugehörigen Kontakt mit dem Nachnamen "Forbes" hat, und für jeden dieser Accounts die Namen aller zugehörigen Kontakte.
Ausführen der gefilterten Abfrage
- Geben Sie im Query Editor Folgendes ein:
SELECT Name, (SELECT Name FROM Contacts) FROM Account WHERE Id IN (SELECT AccountId FROM Contact WHERE LastName = 'Forbes')
- Klicken Sie auf Execute (Ausführen).
Ihre Ergebnisse sollten wie folgt aussehen:
Übersicht
Jetzt wissen Sie, wie Sie den richtigen Typ von Beziehungsabfrage für Standardobjekte auswählen und erstellen können. In der nächsten Einheit erfahren Sie mehr zu Beziehungsabfragen für benutzerdefinierte Objekte.