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ブラウザでアクセスしてみよう。

Webブラウザでfmapi_result_1.phpにアクセス。上から順に、実際に取得したレコード数, 検索条件に該当した対象レコード数, テーブルに登録されているレコード総数が表示された

getFetchCount()は実際に取得したレコード数のため、setRange()で設定した値の影響を受ける。また結果は型を除けば、count($result->getRecords())とおなじになる。getFoundSetCount()は検索条件に該当した対象レコード数、getTableRecordCount()はテーブルに登録されているレコード総数が返ることが確認できた。これら取得した値は、ページャなどで活用できるだろう。