アルファサード株式会社 代表取締役 野田 純生のブログ


PHPerのための Movable Type 講座(その12)


公開日 : 2014-04-24 10:47:32


PHPerのためのMT講座

DynamicMTML編その2。データベース接続を簡単に(ORマッパー)。

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(存在チェック)が可能です。

詳細は公式ドキュメンを参照ください。



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の創業者であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ