著者アーカイブ
sRecordは seasar2の S2JDBC, それをまねて作った拙作teeple2のActiveRecordと似たような使い方でSalesforceのデータを取り扱うことができるPHP5ライブラリです。google codeにオープンソースとして公開していますので是非ご利用ください。
http://code.google.com/p/srecord4p/
今日はcreate(データのINSERT)について説明します。
特に難しいところはありません。オブジェクトを作ってプロパティに値をセットして、create()メソッドを呼び出す、、それだけです。
$account = Sobject_Account::neu(); // same as new Sobject_Account();
$account->Name = 'Scott';
$result = $account->create();
if ($result) {
echo("Account was created. ID is {$account->Id}");
} else {
echo("Account creation failed.");
print_r($account->getErrors());
}
戻り値はBooleanです。create()が成功した場合はオブジェクトに払い出されたIDがセットされます。
エラーが発生した場合は getErrors()メソッドでエラーオブジェクトが取得できます。
(Errorオブジェクトの構造は PHP Toolkit からの戻り値そのままです。)
SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(4) はコメントを受け付けていません
appengineでJSON-RPCサーバーのようなものを作りたいときなど ServletRequest#getInputStream()で取得できるInputStreamを使いたい場合があります。ところがslim3のcontrollerでこれをやろうとするとInputStreamのIllegalStateExceptionが発生します。
Jettyや大概のサーブレットサーバーは getInputStreamとgetParameter(s)を同時には使えないようです。
JSON-RPCならslim3のcontrollerは使う必要ないじゃんといえばそれまでなのですができれば慣れているもので全てやってしまいたいというのも事実。そこで以下のようなworkaroundで回避します。
- StreamFilterを作って、そこでServletRequestをWrapperクラスに置き換える (一番最初にこのFilterが動くようにする)
- RequestWrapperでは getInputStreamをoverrideし、Streamを再利用可能にする
なお、このworkaroundは http://d.hatena.ne.jp/machi_pon/20090120/1232420325 にて紹介されているやり方とほぼ同じです。(ナイスポストありがとうございました!)
public class StreamFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
request = new BufferedServletRequestWrapper( req );
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {
private byte[] buffer;
public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
super( request );
InputStream is = request.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buff[] = new byte[ 1024 ];
int read;
while( ( read = is.read( buff ) ) > 0 ) {
baos.write( buff, 0, read );
}
this.buffer = baos.toByteArray();
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new BufferedServletInputStream( this.buffer );
}
}
public class BufferedServletInputStream extends ServletInputStream {
private ByteArrayInputStream inputStream;
public BufferedServletInputStream(byte[] buffer) {
this.inputStream = new ByteArrayInputStream( buffer );
}
@Override
public int available() throws IOException {
return inputStream.available();
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return inputStream.read( b, off, len );
}
}
slim3のcontrollerでServletInputStreamを使いたいとき はコメントを受け付けていません
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のオブジェクト定義画面から設定することができますのであらかじめわかりやすい名前をつけておくとよいでしょう。
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を指定するには 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);
}
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の表現の対応は以下の通りです。
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されます。
$records = Sobject_Account::neu()
->contains('Name', 'G')
->eq('Owner.Username', 'sato')
->select('Id, Name');
select()メソッドの戻り値は該当するSobjectの配列となります。(上記の例ではSobject_Accountの配列)
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.
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)
SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(1) はコメントを受け付けていません
|