FileMaker_RelatedSetとは

FileMaker_RelatedSetは、ポータル情報の取得に特化したクラスだ。ポータル情報が格納されているFileMaker_Layoutオブジェクトから、各種フィールド情報を取得する。ポータル内で使うFileMaker_Layoutクラス、といったところか。同クラスに用意されている機能をまとめた表を示す。

取得できる情報 メソッド名
FileMaker_Fieldオブジェクト getField(), getFields()
テーブルオカレンス名 getName()
フィールド名 listFields()

ほかのクラスと比較してメソッド数はすくなめだ。また、この中で引数を要求されるのはgetField()のみでさくっと簡単に使えるようになっている。FileMaker_Fieldクラスと同時に使う場面が多いだろう。

ポータルに配置されているフィールド情報を取得 - getField(), getFields()

ポータル内に配置されているフィールド情報を取得するにはgetField()かgetFields()をもちいる。

getFieldメソッド (FileMaker/RelatedSet.php 69-89行目より)

/**
 * Returns the FileMaker_Field object describing $fieldName.
 *
 * @return FileMaker_Field|FileMaker_Error Either a Field object or an error.
 */
function &getField($fieldName)
{
    return $this->_impl->getField($fieldName);
}
  • string $fieldName: FileMaker_Fieldオブジェクトとして取得したいフィールド名を指定

getFieldsメソッド (FileMaker/RelatedSet.php 79-89行目より)

/**
 * Return an associative array with the names of all fields as
 * keys, and the array values will be the associated
 * FileMaker_Field objects.
 *
 * @return array Array of FileMaker_Field objects.
 */
function &getFields()
{
    return $this->_impl->getFields();
}

getField()は指定したフィールドのFileMaker_Fieldオブジェクトが、getFields()はポータル内に配置されている全フィールドのFileMaker_Fieldオブジェクトが配列として返る。

テーブルオカレンス名を取得 - getName()

ポータルに設定されているテーブルオカレンスの名称を取得するにはgetName()をもちいる。

getNameメソッド (FileMaker/RelatedSet.php 48-56行目より)

/**
 * Returns the name of the related set this object describes.
 *
 * @return string Related set name.
 */
function getName()
{
    return $this->_impl->getName();
}

テーブルオカレンス名が文字列型で返る。テーブルオカレンス名を引数に指定して...という機能はFileMaker API for PHPには用意されていないので、単純に名称として取得するか、FileMaker_RecordクラスのgetFieldなどの接頭辞で使用する。

フィールド名の一覧を取得する - listFields()

前述のgetField(), getFields()で取得するFileMaker_Fieldオブジェクトには、フィールドに関するほとんどの情報が格納されている。単純に名称だけを取得したい場合は、このlistFields()のほうが使い勝手が良い。

listFieldsメソッド (FileMaker/RelatedSet.php 58-67行目より)

/**
 * Return an array with the string names of all fields in this
 * related set.
 *
 * @return array Simple list of string field names.
 */
function listFields()
{
    return $this->_impl->listFields();
}

listFields()ではフィールド名だけを配列として返す。ほんのわずかな差だが、getFields()より早く動作するようだ。

実際にこれらを使用したサンプルコードを記述してみよう。FileMakerレイアウトは「レイアウト情報取得に特化したFileMaker_Layout(2)」でのgetRelatedSets/getRelatedSetsメソッド紹介時に使用した「getRelatedSet」をもちいる。

fmapi_relatedset.phpからアクセスするFileMakerレイアウト「getRelatedSet」

fmapi_relatedset.php

<?php

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

$data = new FileMaker('fmapi_test', 'http://localhost:80', 'admin', 'admin');
// レイアウトオブジェクトを取得
$layoutObj = $data->getLayout('getRelatedSet');
// レイアウトオブジェクトエラー判定
if (FileMaker::isError($layoutObj))
{
    // エラー処理..
    echo 'FileMaker Error Code: ' . $layoutObj->getCode();
    echo '<p>'. $layoutObj->getMessage() . '</p>';
}
else
{
    $relatedSetObj = $layoutObj->getRelatedSet('table_a_x_table_b');
    // 正常処理
    ?>
    <table border="1">
        <tr>
            <th>getField('tb_serial')</th>
            <th>getFields()</th>
            <th>getName()</th>
            <th>listFields()</th>
        </tr>
            <tr>
                <td valign="top">
                    <?php
                    $fieldObj = $relatedSetObj->getField( $relatedSetObj->getName() . '::tb_serial');
                    echo '<p>getName: ' . $fieldObj->getName() . '</p>';
                    echo '<p>getResult: ' . $fieldObj->getResult() . '</p>';
                    ?>
                </td>
                <td valign="top">
                    <?php
                    foreach ($relatedSetObj->getFields() as $value )
                    {
                        echo '<p>getName: ' . $value->getName() . '</p>';
                        echo '<p>getResult: ' . $value->getResult() . '</p>';
                        echo '<hr>';
                    }
                    unset($value);
                    ?>
                </td>
                <td valign="top"><pre><?php var_dump($relatedSetObj->getName()); ?></pre></td>
                <td valign="top"><pre><?php var_dump($relatedSetObj->listFields()); ?></pre></td>
            </tr>
    </table>
    <?php
}
?>

このコードではまずFileMakerレイアウト「getRelatedSet」にアクセス。getRelatedSet()でテーブルオカレンスが"table_a_x_table_b"となっているポータル情報をFileMaker_RelatedSetオブジェクトとして取得、各種情報をvar_dump()している。実際にWebブラウザでアクセスしてみよう。

Webブラウザでfmapi_relatedset.phpを表示。getField(), getFields(), getName(), listFields()の取得結果が表示された

関連先テーブルのフィールド情報を取得したい場合、2つのFileMakerレイアウトに2回アクセスするのは非効率的だ。1つのFileMakerレイアウトに必要な分だけポータルで外部テーブルのフィールドを配置しておけば、FileMaker_RelatedSetを使って1リクエストで複数の情報を取得することが可能となる。

おもにデータベースの構造情報について取りあつかうクラスの紹介はこれでひととおり終わりだ。次回以降では、レコードや処理結果の扱いに特化したクラスを紹介していこう。