PHPerのための Movable Type 講座(その12)
公開日 : 2014-04-24 10:47:32
DynamicMTML編その2。データベース接続を簡単に(ORマッパー)。
- PHPerのための Movable Type 講座(その1)
- PHPerのための Movable Type 講座(その2)
- PHPerのための Movable Type 講座(その3)
- PHPerのための Movable Type 講座(その4)
- PHPerのための Movable Type 講座(その5)
- PHPerのための Movable Type 講座(その6)
- PHPerのための Movable Type 講座(その7)
- PHPerのための Movable Type 講座(その8)
- PHPerのための Movable Type 講座(その9)
- PHPerのための Movable Type 講座(その10)
- PHPerのための Movable Type 講座(その11)
PHPからMTのデータベースに接続する方法について、これまでに class MTDatabase を使う方法、class BaseObject を使う方法について紹介しましたが、DynamicMTMLを利用することで、SQLを書かずにMTのデータベースオブジェクトにアクセスすることができます。
これは、MTの心臓部とも言えるPerlの MT::Object をPHP化する目的で作られた(というか、作った)もので、完全な互換性はありませんが、プラグインを書く人にとってはスタティックパブリッシング(Perl)、ダイナミックパブリッシング(PHP)の両方で同じ書き方ができるメリットがあります。
また、「SQLを文字列操作(連結とか)で組み立てるな」って話しもあって、そういう面からもこれを使うメリットがあるかと思います。
プラグインから class DynamicMTMLを取得する
方法は2つ。
global $app;
とするか、
$app = $ctx->stash( 'bootstrapper' );
これで、class DynamicMTMLが取得できます。
loadメソッド
単一オブジェクトを取得(ID指定)
$entry = $app->load( 'Entry', 1 );
IDが1の記事を読み込みます。戻り値は単一のオブジェクトです。
条件を指定して取得
$terms = array( 'blog_id' => 2,
'status' => 2 );
$extra = array( 'limit' => 10,
'offset' => 0, );
$entries = $app->load( 'Entry', $terms, $extra );
var_dump( $entries );
第一引数にモデル、第二引数にWHERE条件を配列で、第三引数に条件を指定(配列)します。戻り値はオブジェクトの配列です。
カテゴリを指定して記事を取得
$terms = array( 'blog_id' => $blog_id,
'status' => 2 );
$extra = array( 'sort' => 'authored_on',
'direction' => 'descend',
'limit' => 10 );
$join = array( 'mt_placement', 'entry_id',
array( 'category_id' => $category_id ) );
$extra[ 'join' ] = $join;
$entries = $app->load( 'Entry', $terms, $extra );
第三引数に、'join'指定できます。
LIKE演算子を指定
$current_ts = $app->current_ts( $blog );
$current_ts = $app->db()->ts2db( $current_ts );
$ymd = preg_replace( '/^(([0-9][^0-9]*){8}).*$/', '$1', $current_ts );
// 2014-04-24
$terms = array( 'blog_id' => $blog->id,
'class' => array( 'entry', 'page' ),
'authored_on' => array( 'like' => $ymd . '%' ),
'status' => 2 );
$entries = $this->load( 'Entry', $terms );
公開日が本日の記事/ページオブジェクトの配列を取得します。指定できる演算子は 'like', 'not_like', 'not_null', 'not', '>', '>=', '<', '<=', '!=' です。
範囲指定(range_incl(range)もしくはstart_val)
require_once( 'MTUtil.php' );
$terms = array( 'blog_id' => $blog_id,
'authored_on' => start_end_month( 20140401 );,
'status' => 2 );
$extra = array( 'sort' => 'authored_on',
'direction' => 'descend',
'range_incl' => array( 'authored_on' => 1 ),
// or 'start_val' => '20140401000000',
);
$entries = $this->load( 'Entry', $terms, $extra );
今月の記事の配列を返します。
あわせてMT::Objectで言うところの、get_by_key(条件指定でロード、なければオブジェクトを生成)、exists(存在チェック)が可能です。
詳細は公式ドキュメンを参照ください。