今回はApexで項目の表示ラベルを汎用的に一括で取得する方法をご紹介します。
#よく見かける項目の表示ラベル取得の方法
String accNameLabel = Schema.SObjectType.Account.fields.Name.label;
この書き方でも問題なく取得することはできますが、
例えばLightningComponent等で作成したTableのcolumnが10列以上ある場合...
String accNameLabel = Schema.SObjectType.Account.fields.Name.label;
String accPhoneLabel = Schema.SObjectType.Account.fields.Phone.label;
String accFaxLabel = Schema.SObjectType.Account.fields.Fax.label;
String accCustomLabel = Schema.SObjectType.Account.fields.CustomField__c.label;
etc...
上記のように同じようなコードを何回も記述する必要があります...
#サンプルコード
まず、上記で紹介した書き方のようにオブジェクトタイプを書かずに汎用的に使えるメソッドにしたいと考えました。また、"Key:API名,Value:表示ラベル"のようなMapがあれば使いやすいだろうとと思い、作成したのが下記のコードになります。
public static Map<String,String> getFieldLabelMap(String sObjectName){
Map<String,String> fieldLabelMap = new Map<String,String>();
for(Schema.SObjectField field : Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().values()){
fieldLabelMap.put(field.getDescribe().getName(), field.getDescribe().getLabel());
}
return fieldLabelMap;
}
上記のメソッドを一つ用意しておけば標準オブジェクトでもカスタムオブジェクトでも問題なく取得することができます。
####ちょっとしたデメリット
項目を指定せず一括で取得しているため、項目の削除やAPI名の変更時などにSalesforceがチェックするApex使用箇所には該当しません。(動的SOQLの利用でも同じことが言えますね)
あたりまえですが、項目の削除やAPI名の変更等を行うときはきちんと影響調査してから行いましょう。
#おまけ SOQLでの"SELECT * "としての利用法
上記コードを少し書き換えるだけで、"SELECT * "の動きも実現することができます。
public static List<sObject> getAllFieldRecords(String sObjectName){
List<String> fieldNameList = new List<String>();
for(Schema.SObjectField field : Schema.getGlobalDescribe().get(sObjectName).getDescribe().fields.getMap().values()){
fieldNameList.add(field.getDescribe().getName());
}
String fieldQuery = String.join(fieldNameList, ',');
List<sObject> sObjects = Database.query('SELECT ' + fieldQuery + ' FROM ' + sObjectName);
return sObjects;
}
カスタム項目のみを取得したい場合、リスト格納前に下記のifを書きます。
if(field.getDescribe().getName().endsWith('__c')){
}