「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」の続編にあたり、PHPの「データ構造」(配列とオブジェクト)について解説します。
配列やオブジェクトは、頭の中で考えるだけでは、イメージがつかみにくいです。本書では図を多用して、配列やオブジェクトをなるべく分かりやすく解説することを心がけました。
Kindle本で、定価250円です。
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"; } ?>