【コラム】
前回に引きつづき、レコードの検索処理について取りあげよう。今回はFileMaker API for PHPを利用する上でかならず押さえておきたい機能「複合検索の実装方法」を紹介する。
前回紹介した3つの検索機能――「検索(-find)」「全件表示(-findall)」「ランダムに1件表示(-findany)」は、FX.phpにおいても同様の機能を実現可能だ。今回はAPI for PHPを利用した場合にのみ実現できる「複合検索の実装方法」にて使用するクラスとメソッドの使い方を紹介しよう。今回おもに紹介するクラスは、前回紹介できなかった「FileMaker_Command_FindRequest」と、関連する「FileMaker_Command_CompoundFind」の2つだ。
複合検索をおこなう場合の、1検索条件を作成するために使用するクラス。複数の検索条件がある場合は、その分のインスタンスを作成することになる。
実際に複合検索をおこなうためのクラス。FileMaker_Command_FindRequestクラスを使用して作成した検索条件のセットを指定し、ソート条件や実行したいFileMakerスクリプトを指定後、検索をおこなう。
複合検索はおもにこの2クラスを使用しておこなうことになる。おおまかな手順は次のとおり。
|
2つのオブジェクトをFileMakerの画面と合わせたイメージ図。newFindRequestでn個の検索条件オブジェクト(FileMaker_Command_FindRequest)を作成し、FileMaker_Command_CompoundFindでそれらをまとめ、検索をおこなう |
前回同様、fmapi_listレイアウトを使用して実際に複合検索をおこなってみよう。fmapi_listレイアウトには、10レコードが登録されている。
今回複合検索で使用する検索条件は次のとおり。
それではこの3つの検索条件をコードにしてみよう。
fmapi_find_test2.php
<?php
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
$findRequest = array();
$findRequest[0] = $data->newFindRequest('fmapi_list');
$findRequest[0]->addFindCriterion('ft_registTimeStamp', '8/18/2009 *:*:*');
$findRequest[0]->addFindCriterion('ft_num', '<10000');
$findRequest[1] = $data->newFindRequest('fmapi_list');
$findRequest[1]->addFindCriterion('ft_text', 'テスト文字列');
$findRequest[1]->addFindCriterion('ft_num', '1000...10000');
$findRequest[2] = $data->newFindRequest('fmapi_list');
$findRequest[2]->addFindCriterion('ft_date', '9/*/2009');
$findRequest[2]->addFindCriterion('ft_num', '>5000');
$compoundFind = $data->newCompoundFindCommand('fmapi_list');
$compoundFind->add(1, $findRequest[0]);
$compoundFind->add(2, $findRequest[1]);
$compoundFind->add(3, $findRequest[2]);
$compoundFind->setRange(0, 10);
$result = $compoundFind->execute();
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理..
$records = $result->getRecords();
?>
<table border="1">
<tr>
<th>ft_serial</th>
<th>ft_registTimeStamp</th>
<th>ft_updateTimeStamp</th>
<th>ft_text</th>
<th>ft_date</th>
<th>ft_num</th>
</tr>
<?php
foreach ($records as $record)
{
echo '<tr>';
echo '<td>' . $record->getField('ft_serial') . '</td>';
echo '<td>' . $record->getField('ft_registTimeStamp') . '</td>';
echo '<td>' . $record->getField('ft_updateTimeStamp'). '</td>';
echo '<td>' . $record->getField('ft_text'). '</td>';
echo '<td>' . $record->getField('ft_date'). '</td>';
echo '<td>' . $record->getField('ft_num'). '</td>';
echo '</tr>';
}
?>
</table>
<?php
}
?>
この複合検索のイメージ図は次のとおり。
|
1つの検索条件につき、1つのFileMaker_Command_FindRequestオブジェクトが割りあてられる。今回は3つの検索条件があるため、オブジェクト数も3つ。3つのFileMaker_Command_FindRequestオブジェクトをFileMaker_Command_CompoundFindオブジェクトに格納し、検索を実行 |
$findRequestを配列とし、$findRequest[0]から$findRequest[2]までそれぞれの検索条件を作成。$compoundFindに作成した検索条件をまとめて複合検索を実行している。これをWebブラウザで表示する。
ほかの検索の方法と比較するとすこしだけ複雑だが、無事に複合検索を実現することができた。FileMaker上で実際におこなった検索と比較しても差がないことから、問題なく複合検索が実装できていることが確認できる。
まずはFileMaker_Command_FindRequestで使用するメソッドだ。
addFindCriterionメソッド (FindRequest.php 59-65行目より)
/**
* Add a find criterion.
*
* @param string $fieldname The field being tested.
* @param string $testvalue The value to test against.
*/
function addFindCriterion($fieldname, $testvalue)
フィールドと検索内容を対にして検索条件を指定する。前回紹介したaddFindCriterionと同じ動作をおこなう。
clearFindCriteriaメソッド (FindRequest.php 70-73行目より)
/**
* Clear all existing find criteria.
*/
function clearFindCriteria()
このメソッドに引数はない。addFindCriterionで指定した検索条件をすべて削除する。
setOmitメソッド (FindRequest.php 49-54行目より)
/**
* Sets if the find request is an omit request.
*
* @param boolean $value true or false.
*/
function setOmit($value)
$valueにtrueを指定すると、その検索条件を除外して検索結果を取得する。
つづけてFileMaker_Command_CompoundFindクラスのメソッドを紹介しよう。
addメソッド (CompoundFind.php 49-55行目より)
/**
* Add a find request to the find set.
*
* @param int $precedence defines the priority in which the find requests are added to the set.
* @param findrequest $findrequest is the find request being added to the compound find set.
*/
function add($precedence, $findrequest)
複合検索の実装の要、複数の検索条件セットを指定するメソッド。当然ながら一度におおくの検索条件セットを指定すると、サーバに負荷がかかり動作が重くなるので注意が必要だ。
addSortRuleメソッド (CompoundFind.php 60-67行目より)
/**
* Add a sorting rule to the find request.
*
* @param string $fieldname The field to sort by.
* @param integer $precedence 1-9, should we sort by this field first, last, etc.
* @param mixed $order FILEMAKER_SORT_ASCEND, FILEMAKER_SORT_DESCEND, or a custom value list.
*/
function addSortRule($fieldname, $precedence, $order = null)
clearSortRulesメソッド (CompoundFind.php 72-75行目より)
/**
* Clear all existing sorting rules.
*/
function clearSortRules()
このメソッドに引数はない。addSortRuleで指定したソート条件をすべて削除する。
getRangeメソッド (CompoundFind.php 91-99行目より)
/**
* Return the current range settings.
*
* @return array An associative array with two keys: 'skip' for
* the current skip setting, and 'max' for the current maximum
* number of records. If either key does not have a value it will
* be set to NULL.
*/
function getRange()
このメソッドに引数はない。現在指定されているレンジ設定($skip, $max)を配列で取得する。
setRangeメソッド (CompoundFind.php 80-87行目より)
/**
* Request only part of the result set.
*
* @param integer $skip The number of records to skip past.
* @param integer $max The maximum number of records to return.
*/
function setRange($skip = 0, $max = null)
addSortRule, clearSortRules, getRange, setRangeは前回紹介したメソッドとおなじ動作をすると考えて良いだろう。いままでの検索と違う点は、addFindCriterionで検索条件を指定するのではなく、addを使って検索条件のセットを指定するところだ。このほか、FileMaker_Commandより次のメソッドも継承する。
用途については前回の最後の部分を参照してほしい。
今回は、FileMaker API for PHPを使用した複合検索の実装方法を紹介した。このような複合検索をFX.phpでおこなうには、いまのところ-queryと-findqueryをうまく用いて実装するか、それぞれの検索結果が格納された配列を自力でマージするといった方法しかない。それと比較すると、かなり簡単にあつかえるようになっていると言えるのではないだろうか。FileMaker API for PHPを使う場合は、かならず押さえておきたい機能だ。
| ファイルメーカー、FileMaker Business Allianceメンバー向け割引購入プログラム [2009/6/4] |
| ファイルメーカー、参加無料イベント「FileMaker Road Show 2009」開催 [2009/6/4] |
| 【インタビュー】ファイルメーカー粟倉社長に聞く、DBアプリ「Bento for iPhone」の国内展開 [2009/6/3] |
| 『ファイルメーカー選手権』でMacBook ProやVAIOを手に入れよう [2009/6/3] |
| 【コラム】Mac Fan ソフトウェアレビュー 第58回 データベース作成ソフト「FileMaker Pro 10」 [2009/5/25] |
| FileMaker、iPhone/iPod touch版「Bento」が登場 - Bento 2.0と同期可能 [2009/5/5] |
| ファイルメーカー、FileMaker用テーマパックを期間限定で無料配布 [2009/4/17] |
| 【インタビュー】FileMaker Pro 10の魅力はいかに? - 米FileMaker社長 ドミニーク P.グピール氏に聞く [2009/2/24] |
| ファイルメーカーの新社長に粟倉豊氏が就任 [2009/2/2] |
| インタフェースを一新した「FileMaker Pro 10」が発売 [2009/1/6] |
| 花粉の運び屋“マルハナバチ”の国勢調査 [18:11 5/24] |
| 「Arid5a」は自己免疫疾患を引き起こすカギ分子の可能性大 - 阪大 [17:39 5/24] |
| 岡山大、中枢神経の「ランビエ絞輪」形成機構の解明に1歩前進 [17:35 5/24] |
| 細胞間接着を担うタンパク質「クローディン」に関する発見 - 阪大など [17:32 5/24] |
| パナソニック、LEDに匹敵する照明用高効率白色有機EL素子を開発 [17:29 5/24] |
|
(知り合ったばかりで)「最近、面白い本あります?」【女性の恋愛心理】 [07:00 5/26] 恋愛・結婚 |
|
TVドラマ「たべるダケ」主演は後藤まりこ、7月から放送 [06:00 5/26] ホビー |
|
[後藤まりこ]話題のロッカーがいきなりドラマ初主演 [06:00 5/26] エンタメ |
|
ジャン=クロード・ヴァン・ダム最大のヒット作『タイムコップ』がリブート化へ [00:09 5/26] エンタメ |
|
ガラパゴス諸島の美しさをストリートビューで - Google Official Blog [23:44 5/25] パソコン |