FileMakerデータベースの構造情報を取得するクラス「FileMaker」「FileMaker_Layout」「FileMaker_Field」「FileMaker_RelatedSet」を紹介してきた。今回からはレコード情報などの取得に特化したクラスを紹介していこう。まずは結果セットの取扱いに特化したクラス「FileMaker_ResultSet」からだ。
FileMaker_Resultとは
FileMaker API for PHPでは各コマンド発行後、結果セット(Result set)と呼ばれる情報が返る。結果セットにはコマンド実行後、影響をうけたレコードやレイアウトに配置されていたポータル情報・テーブルに登録されているレコード数などがふくまれる。この結果セットからFileMaker_ResultSetクラスに用意されている機能を使い、各種FileMaker_LayoutオブジェクトやFileMaker_Recordオブジェクトなど、必要な情報だけを取得して各処理をおこなったり画面を作成する。
同クラスに用意されている機能をまとめた表を示す。
取得できる情報 | メソッド名 | 返り値の型 |
---|---|---|
取得したレコード数 | getFetchCount() | string |
フィールド名 | getFields() | array |
結果セット内の最初のレコード情報 | getFirstRecord() | object FileMaker_Record |
検索条件に該当したレコード数(対象レコード数) | getFoundSetCount() | string |
結果セット内の最後のレコード情報 | getFirstRecord() | object FileMaker_Record |
レイアウト情報 | getLayout() | object FileMaker_Layout |
レコード情報 | getRecords() | array FileMaker_Record |
リレーションで使用されているテーブルオカレンス名 | getRelatedSets() | array |
テーブルに登録されているレコード数 | getTableRecordCount() | string |
各レコード数やフィールド・テーブルオカレンス名以外は、それぞれのオブジェクトを返す。レコードやレイアウトの詳細情報を取得したい場合は、FileMaker_LayoutクラスやFileMaker_Recordクラスを併用しよう。今回は各レコード数を返すメソッドについて取りあげる。
各レコード数の取得について - getFetchCount(), getFoundSetCount(), getTableRecordCount()
それぞれに対応するレコード数が返る。引数はない。返り値はマニュアルやソースにはinteger型が返ると記載されているが、実際にはstring型が返るようだ。
getFetchCountメソッド (FileMaker/Result.php 114-125行目より)
/**
* Returns the number of records in the set that was actually
* returned. If no range parameters were specified this will be
* equal to the result of getFoundSetCount(). It will always be
* equal to the value of count($response->getRecords()).
*
* @return integer Fetch count.
*/
function getFetchCount()
{
return $this->_impl->getFetchCount();
}
コマンドクエリ発行後、実際に取得してFileMaker_Resultオブジェクト内に格納されたレコード数が返る。ソースコメントのとおり、この値はcount($response->getRecords())で得られる値と一緒になる。
getFoundSetCountメソッド (FileMaker/Result.php 104-112行目より)
/**
* Returns the number of records in the entire found set.
*
* @return integer Found count.
*/
function getFoundSetCount()
{
return $this->_impl->getFoundSetCount();
}
検索条件に該当した対象レコード数が返る。検索条件で指定するsetRange()の影響を受けない。
getTableRecordCountメソッド (FileMaker/Result.php 94-102行目より)
/**
* Returns the number of records in the table that was accessed.
*
* @return integer Table count.
*/
function getTableRecordCount()
{
return $this->_impl->getTableRecordCount();
}
指定したテーブルに登録されているレコード総数が返る。
結果を比較するサンプルコードを用意した。実際に使用したレイアウトと検索条件、サンプルコードは次のとおり。
検索に使用するレイアウトはおなじみ「fmapi_list」。検索条件はft_registTimeStampが"2009/10/* *:*:*"であることとした。レコード総数24件中、この検索で対象となるレコード数は13件 |
fmapi_result_1.php
<?php
include_once('../FileMaker.php');
$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// レイアウトオブジェクトを取得
$findCommand = $data->newFindCommand('fmapi_list');
$findCommand->setRange(0, 10);
$findCommand->addFindCriterion('ft_registTimeStamp', '10/*/2009 *:*:*');
$result = $findCommand->execute();
// レイアウトオブジェクトエラー判定
if (FileMaker::isError($result))
{
// エラー処理..
echo 'FileMaker Error Code: ' . $result->getCode();
echo '<p>'. $result->getMessage() . '</p>';
}
else
{
// 正常処理
?>
<table border="1">
<tr>
<th>getFetchCount()</th>
<td valign="top"><pre><?php var_dump($result->getFetchCount()); ?></pre></td>
</tr>
<tr>
<th>count($result->getRecords())</th>
<td valign="top"><pre><?php var_dump(count($result->getRecords())); ?></pre></td>
</tr>
<tr>
<th>getFoundSetCount()</th>
<td valign="top"><pre><?php var_dump($result->getFoundSetCount()); ?></pre></td>
</tr>
<tr>
<th>getTableRecordCount()</th>
<td valign="top"><pre><?php var_dump($result->getTableRecordCount()); ?></pre></td>
</tr>
</table>
<?php
}
?>
newFindCommandで検索条件を作成。setRangeで取得するレコードの範囲を決定。addFindCriterion()でft_registTimeStampが"2009/10/* *:*:*"である条件を追加。検索実行し、結果からgetFetchCount(), count($result->getRecords()), getFoundSetCount(), getTableRecordCount()の値をvar_dump()している。実際にWebブラウザでアクセスしてみよう。
getFetchCount()は実際に取得したレコード数のため、setRange()で設定した値の影響を受ける。また結果は型を除けば、count($result->getRecords())とおなじになる。getFoundSetCount()は検索条件に該当した対象レコード数、getTableRecordCount()はテーブルに登録されているレコード総数が返ることが確認できた。これら取得した値は、ページャなどで活用できるだろう。