概要

sRecordは seasar2の S2JDBC, それをまねて作った拙作teeple2のActiveRecordと似たような使い方でSalesforceのデータを取り扱うことができるPHP5ライブラリです。google codeにオープンソースとして公開していますので是非ご利用ください。
http://code.google.com/p/srecord4p/

今日はrelationship (SQLでいうところのJOIN) について説明します。
SalesforceではSQLでいうテーブル間の 1対多の関係を 「child-parent relationship」、逆に多対1の関係を「parent-child relationship」と呼んでいるようです。
この「関係」はSalesforceのオブジェクト定義画面から設定することができます。注意すべきことはSOQLでは関係を指し示すのに「relationship name」を使うということです。SQLのようにテーブル名(オブジェクト名)ではありません。「relationship name」もSalesforceのオブジェクト定義画面から設定することができますのであらかじめわかりやすい名前をつけておくとよいでしょう。

Child-parent relationship

chile-parent relationshipを指定するには join()メソッドを使います。これはSQLと同じ感覚ですね。第1引数にrelationship nameを、第二引数にはselectしたいカラム名を指定できます(省略した場合はすべてのカラムがselectされる)。

$account = Sobject_Account::neu()
    ->join('Owner','Id, Username')
    ->find('0018000000UoDxpAAF');

※ select()の場合も同様です。
上記の例ではAccountオブジェクトが子、User(Ownerというrelationship nameが標準でつけられている)オブジェクトが親という関係です。
sRecordを実行して取得されるAccountオブジェクトからOwnerのUsernameは以下のように取得できます。

echo ($account->Owner->Username);

join()した親オブジェクトのフィールドは “relationship name” -> “フィールド名”で取得できるということです。

次はネストしたchild-parent relationshipの例です。

$records = Sobject_Case::neu()
    ->join('Contact')
    ->join('Contact.Account')
    ->starts('Contact.Account.Name', 'G')
    ->order('CaseNumber')
    ->select();
foreach ($records as $record) {
    echo ($record->Contact->Account->Name);
}

このように child-parent relationshipはネストすることができます。

Parent-child relationship

parent-child relationshipを指定するには child()メソッドを使用します。例えば、

$records = Sobject_Account::neu()
    ->child('Cases', 'Id, reason', 'reason = ?', 'Feedback')
    ->select('Id, Name');

上記のコードは以下のようなSOQLを実行します。

SELECT Id, Name, (SELECT ID, reason FROM Cases WHERE reason = 'Feedback') FROM Account

子オブジェクトは親オブジェクトのrelationship nameがつけられたフィールドに配列としてセットされます。

$account = Sobject_Account::neu()
    ->child('Cases', 'Id, reason', 'reason = ?', 'Feedback')
    ->find('xxxxxxxxxxxxxxxx');
foreach ($account->Cases as $case) {
    echo ($case->reason);
}

コメントは受け付けていません。