SOQLで子リレーションの情報を取得したいです。
SOQLにて、あるオブジェクトの子リレーションになっているオブジェクトの情報を取得したい場合の話です。
子オブジェクトの参照名は、カスタムオブジェクトの場合は、__rとなっていて、標準オブジェクトは、最後はsをつける形となっています。
子リレーション名とは:Salesforceはオブジェクト間で参照関係を持たせることができますが、子リレーション名は親オブジェクトから子オブジェクトを参照する時の名前です。
①標準オブジェクトの場合
AccountとContact
親(Parent)が Account、子(Child)が Contact という位置づけになる。
子リレーション名で参照
親オブジェクト ===========> 子オブジェクト
親オブジェクト名で参照
親オブジェクト <=========== 子オブジェクト
親 (Account) から子 (Contact) を参照
SELECT Id, Name, (SELECT Id FROM Contacts) FROM Account // Listで表示 (SELECT Id FROM Contacts)
リレーションを使用した値の取得、および条件指定
親から子へのアクセス
開発コンソルでDebug⇒Open Execute Anonymous Window
Accountの所有者ID=登録するユーザーIDの場合は、ContactのNameを表示されたい。
====*=========================================
List<Account> accounts = [SELECT a.Id,a.OwnerId,a.Name,(SELECT c.Id,c.Name FROM Contacts c) From Account a];
For(Account a: accounts){
For(Contact c : a.Contacts){
if(a.OwnerId == UserInfo.getUserId()){
System.debug(a.OwnerId+'***'+c.Name);
System.debug('---蝶々蝶々---');
}
}
}
=========================================*====
子 (Contact) から親 (Account) を参照
SELECT Id, Name, Account.Id, Account.Name FROM Contact
子から親へのアクセス(開発コンソルのコードイメージは添付ファイルに追加いたしました)
====*=========================================
List<Contact> contacts = [SELECT Id,Name,Account.Name,Account.OwnerId FROM Contact];
For(Contact c : contacts){
if(c.Account.Name != null && c.Account.OwnerId == UserInfo.getUserId()){
System.debug(c.Account.Name+'***'+c.Name);
System.debug('---蝶々蝶々---');
}
}
=========================================*====
②カスタムオブジェクトの場合
親オブジェクト:ParentObj__c
子オブジェクト:ChildObj__c
子リレーション名:ChildObjs
どっちが親でどっちが子かというと、参照関係の項目を作った方が子 です。
親 (Account) から子 (Contact) を参照
SELECT Id, Name, (SELECT Id, Name FROM ChildObjs__r) FROM ParentObj__c
親から子へのアクセス
親オブジェクトから子オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目の子リレーション名により辿って子オブジェクトの所定の項目を指定できます。
カスタムオブジェクトの場合には、子リレーション名に__rを付与して記載することになります。
====*=========================================
List<ParentObj__c> parents = [SELECT p.Id,p.OwnerId,p.Name,(SELECT c.Id,c.Name FROM ChildObjs__r c) From ParentObj__c p];
For(ParentObj__c p : parents){
For(ChildObj__c c : p.ChildObjs__r){
if(p.OwnerId == UserInfo.getUserId()){
System.debug(p.OwnerId+'***'+c.Name);
System.debug('---蝶々蝶々---');
}
}
}
=========================================*====
子 (Contact) から親 (Account) を参照
SELECT Id, Name, ParentObj__c, ParentObj__r.name FROM ChildObj__c
子から親へのアクセス
子オブジェクトから親オブジェクトをSOQLで使用したい場合は、対象の子オブジェクトで定義されている主従関係もしくは参照関係の項目により辿って親オブジェクトの所定の項目を指定できます。
カスタムオブジェクトの場合には、項目のAPI参照名の__cの部分を__rに変換して記載することになります。
====*=========================================
List<ChildObj__c> childs = [SELECT Id,Name,ParentObj__r.Name,ParentObj__r.OwnerId FROM ChildObj__c];
For(ChildObj__c c : childs){
if(c.ParentObj__r.Name != null && c.ParentObj__r.OwnerId == UserInfo.getUserId()){
System.debug(c.ParentObj__r.Name+'***'+c.Name);
System.debug('---蝶々蝶々---');
}
}
=========================================*====
以上となります。
もしかしたら、毎日、昨日の自分より今日の自分は良くなるなら、十分だと思います。
何より大事なことは、人生を楽しむこと、幸せを感じること、それだけです。
Latest posts by zchao (see all)
- リストビューのカラムにリンクできるAccount Ownerを追加 - 2020年6月12日
- Salesforce環境構造一覧 - 2020年5月10日
- Salesforce プラットフォーム紹介 - 2020年5月9日