Apex Trigger
Before / After Triggerの違い
Before Trigger
- DMLがCommitされる前に実行される.
- 入力規則が更新したいオブジェクトに設定されている場合.
- 新規作成、更新をトリガされた同じオブジェクトで行う場合.
After Trigger
- DMLがCommitされた後に実行される.
- 新規作成、更新をトリガされた関連オブジェクトで行う場合.
- メール通知を行いたい場合.
- トリガされた同じレコードはRead Onlyとなる(すでにCommitされているため).
トリガコンテキスト変数
- トリガされたTriggerのコンテキスト(実行された状態)によって
if
分岐などが可能. Trigger.isUpdate
とか.
developer.salesforce.com
SOQL
- イマイチSalesforce流のJOINとかがわかっていない.
- カスタム項目でLookupで他オブジェクトとの関連項目を作成した場合、そのオブジェクトが子となる.
- 子から親を参照する場合、子にあるカスタムLookup項目は
Id
しか取得できないので、他項目を取得したい場合は、__r
が必要. - カスタムオブジェクト(子) → 標準オブジェクト(親)のSOQLをしたい場合でも、
__r
が必要になる. - 下記例は、
Account
にLookupしているClient__c
というカスタム項目と、Account
のName
を取得する場合の例. Client__r
はどこからやってくるかというと、Client__c
のカスタム項目名となる.
SELECT Id, Client__c, Client__r.Name FROM ChildObj__c
ApexでのParent - ChildでのSOQL
- 親から子テーブルを参照するときに、どうやってApexで子オブジェクトの項目にアクセスするのか不明でした.
- 例えば、
acc
をDebugしても、AccountのIdしか取得できない. - そのため、子オブジェクトを再度ループさせて取得する必要がある.
List<Account> acct = [SELECT id, (SELECT id FROM Contacts) FROM Account LIMIT 3]; for(Account acc : acct) { System.debug(acc); for(Contact c : acc.Contacts) { System.debug(c); } }