前回よりFileMakerデータ結果セットの取扱いに特化したクラス「FileMaker_ResultSet」について紹介している。今回は前回の続きから、残り6メソッドについて紹介しよう。

取得できる情報 メソッド名 返り値の型
フィールド名 getFields() array
結果セット内の最初のレコード情報 getFirstRecord() object FileMaker_Record
結果セット内の最後のレコード情報 getLastRecord() object FileMaker_Record
レイアウト情報 getLayout() object FileMaker_Layout
レコード情報 getRecords() array FileMaker_Record
リレーションで使用されているテーブルオカレンス名 getRelatedSets() array

フィールド・レイアウト・テーブルオカレンス名の取得について
- getFields(), getLayout(), getRelatedSets()

それぞれに対応する名称や情報を格納した配列・オブジェクトが返る。引数はない。

getFieldsメソッド (FileMaker/Result.php 71-82行目より)

/**
 * Return a list of the names of all fields in the records that
 * are part of this response. Just the names are returned; if
 * additional information is required then Layout object provided
 * by getLayout() must be consulted.
 *
 * @return array String field names.
 */
function getFields()
{
    return $this->_impl->getFields();
}

レイアウトに配置されているフィールドの名称が文字列型の配列で返る。いままでに紹介してきたFileMaker_LayoutクラスFileMaker_RelatedSetクラスのlistFields()の動作に相当する。なお、このメソッドはポータル内に配置しているフィールドが含まれないので注意されたい。

getLayoutメソッド (FileMaker/Result.php 46-55行目より)

/**
 * Get the FileMaker_Layout object describing the layout of this
 * response.
 *
 * @return FileMaker_Layout The layout description.
 */
function &getLayout()
{
    return $this->_impl->getLayout();
}

指定したレスポンスレイアウトについての情報がFileMaker_Layoutオブジェクトとして返る。FileMaker_Layoutクラスの各機能を使って詳細情報を拾っていくことになる。レスポンスレイアウトについては「スピードアップのために徹底チューニング(1) フィールドの配置法」も参照されたい。

getRelatedSetsメソッド (FileMaker/Result.php 84-92行目より)

/**
 * Return the names of all related sets present in this record.
 *
 * @return array String related set names.
 */
function getRelatedSets()
{
    return $this->_impl->getRelatedSets();
}

指定したレイアウトに配置されている全ポータルのテーブルオカレンス名が文字列型の配列で返る。FileMaker_Layoutクラスに同名のメソッドがあるが、機能的にはlistRelatedSets()に相当する。

まずはこの3つのメソッドがどのような動作をするか確認してみよう。FileMakerレイアウトはgetRelatedSetを指定する。

fmapi_result_2.php

<?php

include_once('../FileMaker.php');

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// 検索条件を作成
$findCommand = $data->newFindAnyCommand('getRelatedSet');
$result = $findCommand->execute();
// FileMaker_RelatedSetオブジェクトエラー判定
if (FileMaker::isError($result))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $result->getCode();
    echo '<p>'. $result->getMessage() . '</p>';
}
else
{
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th>getFields()</th>
            <th>getLayout()</th>
            <th>getRelatedSets()</th>
        </tr>
        <tr>
            <td valign="top"><pre><?php var_dump($result->getFields()); ?></pre></td>
            <td valign="top"><pre><?php var_dump($result->getLayout()); ?></pre></td>
            <td valign="top"><pre><?php var_dump($result->getRelatedSets()); ?></pre></td>
        </tr>
    </table>
    <?php
}
?>

newFindAnyCommand()でランダムに1件レコードを取得し、FileMaker_RelatedSetオブジェクトを取得。getFields(), getLayout(), getRelatedSets()の動作をそれぞれ確認している。これをWebブラウザで表示してみよう。

getFields(), getRelatedSets()はそれぞれの名称がシンプルに配列で、getLayout()ではFileMaker_Layoutオブジェクトが返っていることがわかる

getFields()ではポータルに配置しているフィールドの名称まで拾えない。getLayout()からFileMaker_Layoutオブジェクトを取得し、そこから取得することになる。

レコード情報の取得について
- getRecords(), getFirstRecord(), getLastRecord()

getRecordsメソッド (FileMaker/Result.php 57-69行目より)

/**
 * Returns an array containing each record in the result set. Each
 * member of the array is a FileMaker_Record object, or an
 * instance of the class name set in the API for instantiating
 * Records. The array may be empty if the response contains no
 * records.
 *
 * @return array The record objects.
 */
function &getRecords()
{
    return $this->_impl->getRecords();
}

指定した検索条件に該当・取得したレコード情報がFileMaker_Recordオブジェクトの配列として返る。FileMaker_Recordクラスの使い方は次回以降紹介していこう。

getFirstRecordメソッド (FileMaker/Result.php 127-135行目より)

/**
 * Returns the first record in this result set.
 *
 * @return FileMaker_Record object The first record in the result set.
 */
function getFirstRecord()
{
    return $this->_impl->getFirstRecord();
}

getLastRecordメソッド (FileMaker/Result.php 137-145行目より)

/**
 * Returns the last record in this result set.
 *
 * @return FileMaker_Record object The last record in the result set.
 */
function getLastRecord()
{
    return $this->_impl->getLastRecord();
}

指定した検索条件に該当・取得したレコード情報のうち、それぞれ最初・最後の1レコードをFileMaker_Recordオブジェクトとして返す。一覧画面のページャなどに利用すると良いだろう。

結果を比較するサンプルコードを用意した。

fmapi_result_3.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);
$getRange = $findCommand->getRange();
$findCommand->addFindCriterion('ft_registTimeStamp', '10/*/2009 *:*:*');
$result = $findCommand->execute();
// FileMaker_RelatedSetオブジェクトエラー判定
if (FileMaker::isError($result))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $result->getCode();
    echo '<p>'. $result->getMessage() . '</p>';
}
else
{
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th>&nbsp;</th>
            <?php
            foreach( $result->getFields() as $fieldName )
            {
                ?>
                <th><?php echo $fieldName; ?></th>
                <?php
            }
            unset($fieldName);
            ?>
        </tr>
        <tr>
            <th rowspan="<?php echo $getRange['max']; ?>">getRecords()</th>
            <?php
            foreach( $result->getRecords() as $recordValue )
            {
                echo ( 0 < $recordKey ) ? '<tr>' : '';
                foreach( $result->getFields() as $fieldName )
                {
                    ?>
                    <td><?php echo $recordValue->getField($fieldName); ?></td>
                    <?php
                }
                unset($fieldName);
                echo '</tr>';
            }
            unset($recordValue);
            ?>
        </tr>
        <tr>
            <th>getFirstRecord()</th>
            <?php
            foreach( $result->getFirstRecord() as $recordValue )
            {
                foreach( $result->getFields() as $fieldName )
                {
                    ?>
                    <td><?php echo $recordValue->getField($fieldName); ?></td>
                    <?php
                }
                unset($fieldName);
            }
            unset($recordValue);
            ?>
        </tr>
        <tr>
            <th>getLastRecord()</th>
            <?php
            foreach( $result->getLastRecord() as $recordValue )
            {
                foreach( $result->getFields() as $fieldName )
                {
                    ?>
                    <td><?php echo $recordValue->getField($fieldName); ?></td>
                    <?php
                }
                unset($fieldName);
            }
            unset($recordValue);
            ?>
        </tr>
    </table>
    <?php
}
?>

各メソッドでFileMaker_Recordオブジェクトを取得。前半で紹介したgetFields()でレイアウトに配置されているフィールドを取得し、レコードをそれぞれ展開している。これをWebブラウザで表示してみよう。

getRecords()では検索に該当した対象レコード分のFileMaker_Recordオブジェクトが配列で。getFirstRecord(), getLastRecord()ではそれぞれ先頭・最後の1レコードだけのオブジェクトが返る

setRangeのmax値を調節し、1件だけ取得した場合の結果。1件だけでもこれらのメソッドは動作する

上記のようにgetRecords()とgetFields()を組み合わせることで、レイアウトに配置したフィールドだけを表示する一覧画面も簡単に作成できる。ぜひ覚えておこう。