“sRecord” カテゴリのアーカイブ


概要

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);
}

Comments SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(3) はコメントを受け付けていません


概要

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

今日はクエリーについて説明します。

メソッドチェーン

sRecordを使うとメソッドチェーンでSOQL(Salesforce Object Query Language)を組み立てて実行することができます。
例えば以下のSOQLを実行したい場合、

SELECT Account.Name, FROM Account WHERE Name LIKE '%G%' AND Owner.Username = 'sato'

sRecordでは以下のように書くことができます。


$records = Sobject_Account::neu()
    ->contains('Name', 'G')
    ->eq('Owner.Username', 'sato')
    ->select('Name');

sRecordのメソッドとSOQLの対応表

sRecordのメソッドとSOQLの表現の対応は以下の通りです。

function SOQL sRecord method
Equals name = ‘foo’ eq(‘name’, ‘foo’)
Not equals name != ‘foo’ ne(‘name’, ‘foo’)
Less than age < '10' lt(‘age’, 10)
Less equal age <= '10' le(‘age’, 10)
Greater than age > ’10’ gt(‘age’, 10)
Greater equal age >= ’10’ ge(‘age’, 10)
Like name like ‘%foo%’ contains(‘name’,’foo’)
name like ‘foo%’ starts(‘name’,’foo’)
name like ‘%foo’ ends(‘name’,’foo’)
name like ‘%appl_%’ where(“name like ‘%appl_%'”)
includes, excludes MSP1__c includes (‘AAA;BBB’, ‘CCC’) includes(‘MSP1__c’, ‘AAA;BBB’, ‘CCC’) or
includes(‘MSP1__c’, array(‘AAA;BBB’,’CCC’))
Boolean BooleanField = TRUE eq(‘BooleanField’, TRUE)
BooleanField = FALSE eq(‘BooleanField’, FALSE)
Null SomeField = null eq(‘SomeField’, null)
SomeField != null ne(‘SomeField’, null)
In age in (’10’,’20’,’30’) in(‘age’, ’10’,’20’,’30’) or
in(‘age’,array(’10’,’20’,’30)
Order ORDER BY name, age order(‘name, age’)
Limit LIMIT 10 limit(10)
Offset OFFSET 10 offset(10)

SELECTするカラムの指定

SELECTするカラムを指定したい場合はselect()の引数にカンマ区切りで指定してください。
パラメータがない場合はすべてのカラムがSELECTされます。


$records = Sobject_Account::neu()
    ->contains('Name', 'G')
    ->eq('Owner.Username', 'sato')
    ->select('Id, Name');

クエリ結果の取得

select()メソッドの戻り値は該当するSobjectの配列となります。(上記の例ではSobject_Accountの配列)

1レコード(オブジェクト)を取得したい場合は

find()メソッドを使います。find()メソッドはクエリー結果が複数行の場合はExceptionを投げます。クエリー結果が0行の場合はNULLを返します。

find()メソッドでは第一引数にレコードのIDを指定することができます。第二引数はSELECTするカラムです。(どちらもNULL可)


// example for specifing Id

$account = Sobject_Account::neu()->find('xxxxxxxxxxxxxxxx'); // xxxxx is Id of Salesforce SObject.

Comments SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(2) はコメントを受け付けていません


概要

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

今日はセットアップ方法について説明します。

セットアップ

アーカイブを解凍します。

$ unzip srecord-x.x.x.zip
$ ls srecord
bin lib test

Partner WSDLを取得し”lib/wsdl”に配置します。
Partner WSDLを取得するにはSalesforceにログインし、
設定 -> アプリケーションの設定 -> 開発 -> API から「パートナーWSDLの作成」をクリックして”partner.wsdl”という名前で保存してください。

“lib/config.php” を編集して username, password, securityToken, wsdlPath を適切に設定してください。

Srecord_Schema::$username = 'salesforceusername';
Srecord_Schema::$password = 'salesforcepassword';
Srecord_Schema::$securityToken = 'salesforcesecuritytoken';
Srecord_Schema::$wsdlPartner = dirname(__FILE__)."/wsdl/partner.wsdl";

“bin/generator.php”を実行してエンティティクラスを作成してください。

$ cd bin
$ php generator.php

“lib/sobject”に 「Sobject_SObject名」 というクラス名でエンティティクラスが作成されます。
“lib/sobjectdef”は Sobject_* のベースクラスです。
Salesforceのオブジェクト定義を変更したときは再度 generator.phpを実行してください。
ファイルが存在する場合はsobjectdefのみ置き換わりますのでsobjectのほうに書いたロジックは消されることはありません。

これで準備完了です。エンティティクラスを使用したいファイル内で lib/config.phpを require_onceするだけですべてのエンティティクラスが使用できるようになります。(autoload)

Comments SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(1) はコメントを受け付けていません


概要

SalesforceのデータはSOAP APIを使って外部から参照/更新することができます。PHP用には PHP Toolkit というものが用意されていますが、これをラップする形でより使いやすくしたものがここで紹介するsRecordです。
sRecordは seasar2の S2JDBC, それをまねて作った拙作teeple2のActiveRecordと似たような使い方でSalesforceのデータを取り扱うことができるというすぐれものです。google codeにオープンソースとして公開していますので是非ご利用ください。
http://code.google.com/p/srecord4p/
これから何回かに分けて使い方を説明していきます。

環境:

  • PHP5.2以上
  • Salesforce PHP Toolkit 13.1
  • Salesfoce Partner WSDL

イントロダクション

以下のようなクエリー(SOQL)を実行したい場合のコードを比較してみます。

SELECT Account.Name, Account.Owner.Name FROM Account WHERE Name LIKE '%G%' AND Owner.Username = 'sato'

PHP Toolkitを素で使うと以下のようなコードになります。


<?php
// SOAP_CLIENT_BASEDIR - folder that contains the PHP Toolkit and your WSDL
// $USERNAME - variable that contains your Salesforce.com username (must be in the form of an email)
// $PASSWORD - variable that contains your Salesforce.com password

define("SOAP_CLIENT_BASEDIR", "../../soapclient");
require_once (SOAP_CLIENT_BASEDIR.'/SforcePartnerClient.php');
require_once (SOAP_CLIENT_BASEDIR.'/SforceHeaderOptions.php');

require_once ('../userAuth.php');

try {
  $mySforceConnection = new SforcePartnerClient();
  $mySoapClient = $mySforceConnection->createConnection(SOAP_CLIENT_BASEDIR.'/partner.wsdl.xml');
  $mylogin = $mySforceConnection->login($USERNAME, $PASSWORD);

  $query = "SELECT Account.Name, Account.Owner.Name FROM Account WHERE Name LIKE '%G%' AND Owner.Username = 'sato'";
  $response = $mySforceConnection->query($query);
  $queryResult = new QueryResult($response);

  foreach ($queryResult->records as $record) {
      echo("<td>{$record->Id}</td>");
      echo("<td>{$record->fields->Name}</td>");
      echo("<td>{$record->fields[0]->fields->Name</td>");
  }

} catch (Exception $e) {
  print_r($mySforceConnection->getLastRequest());
  echo $e->faultstring;
}
?>

一方、sRecordを使用した場合は以下のように簡潔に書くことができます。


<?php
require_once ('/path/to/lib/config.php');

$records = Sobject_Account::neu()
  ->join('Owner', 'Name')
  ->contains('Name', 'G')
  ->eq('Owner.Name', 'sato')
  ->select('Name');

foreach ($records as $record) {
      echo("<td>{$record->Id}</td>");
      echo("<td>{$record->Name}</td>");
      echo("<td>{$record->Owner->Name</td>");
}
?>

sRecordには以下のような特徴があります。

  • 直感的な「メソッドチェーン」パターンでSOQLクエリーを構築できる。
  • Salesforceに接続する手続きが隠蔽されているので開発者が意識する必要はない。
  • クエリーの結果がオブジェクトの階層構造になるので、child-parent relationship, parent-child relationship のクエリー結果が扱いやすい。
  • Salesforceに定義された内容にしたがってエンティティクラスが自動生成されるので、エンティティクラスにロジックを追加することも可能。
  • Eclipse PDTでの開発に適するようにコメントを入れてあるのでコードアシストが効く。

次回から少し詳しく解説していきます。

参考

Comments Salesforceのデータを使用するWebアプリ作成に最適なPHP5用ライブラリ「sRecord」を作りました。 はコメントを受け付けていません