MT5のPHP APIを探る(その2)

昨日に続いて、MT5のPHP APIを探ってみます。
今日は、複雑な条件を指定してオブジェクトを読み込む方法を紹介します。

1.ダミーのオブジェクトの作成

複雑な条件を指定してオブジェクトを読み込む場合、まずダミーのオブジェクトを作成して、そのオブジェクトに対してFindメソッドを実行します。

例えば、ブログ記事を読み込みたい場合、まずブログ記事のクラス(Entry)のダミーのオブジェクトを作成します。
また、ブログ記事のクラスはMTのディレクトリ→「php」ディレクトリ→「lib」ディレクトリにある「class.mt_entry.php」で定義されていますので、このクラスのファイルも読み込みます。

例えば、ダミーのブログ記事を変数$_entryに割り当てるには、以下のように書きます。

require_once('lib/class.mt_entry.php');
$_entry = new Entry;

2.検索の条件と並び順の指定

Findメソッドの1つ目のパラメータでは、検索の条件と、オブジェクトの並び順を、SQLで記述します。
例えば、以下のような条件と並び順でブログ記事を読み込みたいとします。

  • IDが2番のブログから、IDが3番のカテゴリの記事を読み込む
  • 公開されている記事を読み込む(entry_status列の値が2)
  • 日付の新しい順に並べ替える

検索の条件と並び順を変数$whereOrderByに代入するとすると、以下のように書くことができます。

$whereOrderBy = <<< HERE
entry_blog_id = 2
and entry_status = 2
and placement_category_id = 3
order by entry_authored_on desc
HERE;

3.結合の指定

テーブル間の結合(join)は、連想配列を使って指定します。

結合の条件は、連想配列の「join」という名前の要素に入れます。
join要素に入れる値も連想配列で、以下のように書きます。

array(
    'テーブル名' => array(
        'condition' => '結合の条件を表すSQL'
    )
)

例えば、カテゴリを指定してブログ記事を読み込みたいとします。
この場合、ブログ記事のテーブルに、「mt_placement」というテーブルを結合し、mt_placementテーブルの「placement_entry_id」列とブログ記事のテーブルの「entry_id」列が等しい、という条件を指定します。
結合の条件を$extrasという連想配列に入れるとすると、以下のように書きます。

$extras['join'] = array(
    'mt_placement' => array(
        'condition' => 'placement_entry_id = entry_id'
    )
);

4.limit/offsetの指定

読み込むオブジェクトの件数(limit)/読み込み開始位置(offset)も、結合の条件と同じ連想配列に指定します。

例えば、前述の$extras連想配列に、「読み込む記事の件数を10件にする」という条件を追加するには、以下のように書きます。

$extras['limit'] = 10;

また、先頭から5件のブログ記事をスキップしてその次から読み込むには、以下のように書きます。

$extras['offset'] = 5;

5.オブジェクトの読み込み

次に、手順1で作ったダミーオブジェクトを使って、Findメソッドを実行します。

ダミーオブジェクト->Find(検索と並べ替えの条件, false, false, 結合/limit/offset);

Findメソッドの戻り値は、読み込んだオブジェクトの配列になります。

6.例

以下のような条件でブログ記事を読み込み、それらのタイトルを一覧表示したいとします。

  • IDが2番のブログから、IDが3番のカテゴリの記事を読み込む
  • 公開されている記事を読み込む
  • 日付の新しい順に並べ替える
  • 最近の10件を読み込む

このプログラムは以下のようになります。

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . '/path/to/MT_DIR/php');
require_once('mt.php');
$cfg_file = 'mt-config.cgi';
$mt = MT::get_instance(null, $cfg_file);

require_once('lib/class.mt_entry.php');
$_entry = new Entry;

$whereOrderBy = <<< HERE
entry_blog_id = 2
and entry_status = 2
and placement_category_id = 3
order by entry_authored_on desc
HERE;
$extras['join'] = array(
    'mt_placement' => array(
        'condition' => 'placement_entry_id = entry_id'
    )
);
$extras['limit'] = 10;

$entries = $_entry->Find($whereOrderBy, false, false, $extras);
foreach ($entries as $entry) {
    print $entry->title . "\n";
}
?>