FX.php、FileMaker API for PHPの基本操作からパフォーマンス比較、そしてFMCakeMixの基本操作チュートリアルを紹介してきた。1回目ではFX.phpで複合検索をおこなうにあたり-findquery/-queryの構造を、2回目ではFX.phpで-findquery/-queryを使った複合検索のコーディングを紹介した。今回はさまざまな検索パターンを取りあげよう。

FX.phpでの複合検索 - findquery/queryを使ったさまざまなパターン

前回に引きつづき、-findqueryと-queryを使って実際にFX.phpでさまざまな検索パターンを試してみよう。FileMakerファイルは前回とおなじものを使用。

  • ファイル名: fxphp_tips.fp7
  • テーブル名: gelende
  • レイアウト名: 複合検索テスト_ゲレンデ情報

検索条件パターン1

まずは複合検索ではない、簡単なパターンから。-findqueryと-queryを使って「群馬県内の、最大滑走距離が2000以上かつ、最大斜度が20以上」のゲレンデを絞り込んで表示してみよう。

検索条件

  • 1番目の検索条件: フィールド「address」に"群馬"がふくまれているかつ、フィールド「length」が"2000"以上かつ、フィールド「maxAngle」が"30"以上であること

1回目に紹介した実装順に沿って、クエリを組み立てる。

  1. クエリIDとFileMakerフィールド名を紐付け
  2. クエリIDに検索したい文字列を指定
  3. クエリIDを使用して、検索条件を組み立てる

クエリIDとFileMakerフィールド名を紐付け

クエリIDとFileMakerフィールド名を紐づける。使用するクエリID数は3つ。

  • -q1: address
  • -q2: length
  • -q3: maxAngle

このクエリを連結すると、次の文字列になる。前回と同様だ。

-q1=address&-q2=length&-q3=maxAngle

クエリIDに検索したい文字列を指定

続いて、クエリIDに検索したい文字列を指定する。

  • -q1.value: 群馬
  • -q2.value: >=2000
  • -q3.value: >=30

演算子"gte"を使わずに直接">="を検索条件にもちいているのは、前回と同様。このクエリを連結すると、次の文字列になる。

-q1.value=群馬&-q2.value=>=2000&-q3.value=>=30

クエリIDを使用して、検索条件を組み立てる

最後に、-queryクエリパラメータでクエリIDを指定して、検索条件を組み立てる。

-query=(q1,q2,q3)

これらのクエリを連結して検索リクエストを発行すると次の構文となる。

-q1=address&-q2=length&-q3=maxAngle&
-q1.value=群馬&-q2.value=>=2000&-q3.value=>=30&
-query=(q1,q2,q3)&
-findquery

FX.phpを使った実装例は次のとおり。

FX.php 検索パターン1サンプル

<?php
include_once('../fx/FX.php');
include_once('../fx/FX_Fuzzy_Debugger.php');

$data = new FX('localhost', 80, 'FMPro9', 'http');

$data->SetDBData('fxphp_tips.fp7','複合検索テスト_ゲレンデ情報');
$data->SetDBUserPass('admin','');

$data->SetCharacterEncoding('utf8');
$data->SetDataParamsEncoding('utf8');

// 1. クエリIDとFileMakerフィールド名を紐付け
$data->AddDBParam('-q1', 'address');
$data->AddDBParam('-q2', 'length');
$data->AddDBParam('-q3', 'maxAngle');

// 2. クエリIDに検索したい文字列を指定 
$data->AddDBParam('-q1.value', '群馬');
$data->AddDBParam('-q2.value', '>=3000');
$data->AddDBParam('-q3.value', '>=30');

// 3. クエリIDを使用して、検索条件を組み立てる
$data->AddDBParam('-query', '(q1,q2,q3)');

// 検索実行
$result = $data->DoFXAction('-findquery', true, true, 'full');

?>
<table>
    <tr>
        <th>
            serial
        </th>
        <th>
            ゲレンデ名
        </th>
        <th>
            住所
        </th>
        <th>
            最大滑走距離
        </th>
        <th>
            最大斜度
        </th>
    </tr>
<?php
foreach ($result['data'] as $key => $record)
{
    ?>
    <tr>
        <td>
            <?php echo $record['serial'][0]; ?>
        </td>
        <td>
            <?php echo $record['name'][0]; ?>
        </td>
        <td>
            <?php echo $record['address'][0]; ?>
        </td>
        <td>
            <?php echo number_format($record['length'][0]); ?>m
        </td>
        <td>
            <?php echo $record['maxAngle'][0]; ?>
        </td>
    </tr>
    <?php
}
?>

-findquery/-queryは「複数の検索レコードおよびレコード除外リクエストを使用して、検索リクエストを送信」する機能だが、今回のように複合ではなく、単純な検索条件でも動作する。

検索条件パターン2

続いてやや複雑な複合検索のパターンをためす。「群馬県または長野県または新潟県の、最大滑走距離が3000以上か、最大斜度が30以上」のゲレンデを絞り込んで表示してみよう。

検索条件

  • 1番目の検索条件: フィールド「address」に"群馬"がふくまれているかつ、フィールド「length」が"3000"以上であること
  • 2番目の検索条件: フィールド「address」に"群馬"がふくまれているかつ、フィールド「maxAngle」が"30"以上であること
  • 3番目の検索条件: フィールド「address」に"長野"がふくまれているかつ、フィールド「length」が"3000"以上であること
  • 4番目の検索条件: フィールド「address」に"長野"がふくまれているかつ、フィールド「maxAngle」が"30"以上であること
  • 5番目の検索条件: フィールド「address」に"新潟"がふくまれているかつ、フィールド「length」が"3000"以上であること
  • 6番目の検索条件: フィールド「address」に"新潟"がふくまれているかつ、フィールド「maxAngle」が"30"以上であること

クエリIDとFileMakerフィールド名を紐付け

クエリIDとFileMakerフィールド名を紐づける。使用するクエリID数は5つ。

  • -q1: address
  • -q2: address
  • -q3: address
  • -q4: length
  • -q5: maxAngle

このクエリを連結すると、次の文字列になる。

-q1=address&-q2=address&-q3=address&-q4=length&-q5=maxAngle

クエリIDに検索したい文字列を指定

続いて、クエリIDに検索したい文字列を指定する。

  • -q1.value: 群馬
  • -q2.value: 長野
  • -q3.value: 新潟
  • -q4.value: >=3000
  • -q5.value: >=30

-q1, -q2, -q3には住所の検索条件を指定すれば良いので、ここに検索したい都道府県「群馬」「長野」「新潟」を指定する。

-q1.value=群馬&-q2.value=長野&-q3.value=新潟&-q4.value=>=2000&-q5.value=>=30

クエリIDを使用して、検索条件を組み立てる

最後に、-queryクエリパラメータでクエリIDを指定して、検索条件を組み立てる。

-query=(q1,q4);(q1,q5);(q2,q4);(q2,q5);(q3,q4);(q3,q5)

これらのクエリを連結して検索リクエストを発行すると次の構文となる。

-q1=address&-q2=address&-q3=address&-q4=length&-q5=maxAngle&
-q1.value=群馬&-q2.value=長野&-q3.value=新潟&-q4.value=>=2000&-q5.value=>=30&
-query=(q1,q4);(q1,q5);(q2,q4);(q2,q5);(q3,q4);(q3,q5)&
-findquery

パッと見長くて複雑なクエリだが、これらは先の1~6番目の検索条件をクエリIDに置きかえているだけ。このクエリはFileMaker Proで検索をおこなう場合、次の検索条件と同様の意味となる。

上記複合検索条件をFileMaker Pro上で再現した場合

FX.phpを使った実装例は次のとおり。

FileMakerでの検索結果とWebブラウザでの表示結果は次のとおり。

この複合検索条件に該当したレコードは46件

Webブラウザに表示されたのは46件。複合検索がうまく動作していることがわかる

複雑な複合検索条件でもこのように段階を踏んでクエリを構築していけば、意外とさくっと実装できてしまう。複合検索を実装する場面になったら、まずは要件を「簡単な日本語」に直すところから。その後「FileMaker Proならどのように検索すれば良いか」を考え、各クエリIDに置きかえたあとの構文がイメージできれば実装できたも同然だ。くり返しになるが、何回も自分で検索のパターンを作り、コーディングをおこなって試行錯誤しながら覚えよう。