Movable TypeのORMがleft joinに対応

以前に、Movable Type 5.1への要望の1つとして、「ORMでleft joinをできるようにしてほしい」というようなことを書きました。
どうやら、Movable Type 5.1でこの要望がかなうようです。

これまでのMovable TypeのORMは、left joinに対応していませんでした。
そのため、「カテゴリに属さないブログ記事」や、「どのオブジェクトとも結びついていないアイテム」を読み込むには、まわりくどいコードを書くことが必要でした。

先日、何気なくMovable Typeのtracのtimelineを眺めていると、11月30日のChangeset 6464として、「Use left join for search uncategorized entries. bugzid:105174.」を見つけました。
「・・・left join・・・だと?」と思ってさらに見てみると、11月2日のChangeset 6275で、「Implemented to support type-ed join」という修正が行われていました。

早速、left joinを試してみました。
例えば、IDが2番のブログから、カテゴリに属さないブログ記事を読み込むには、以下のように書きます。

my @entries = MT->model('entry')->load(
    {
        blog_id => 2
    },
    {
        join => MT->model('placement')->join_on(
            undef,
            {
                id => \'is null',
            },
            {
                type => 'left',
                condition => {
                    entry_id => \'= entry_id',
                },
            },
        ),
    }
);

また、IDが2番のブログで、どのオブジェクトとも結びついていないアイテムは、以下のコードで読み込むことができました。

my @assets = MT->model('asset')->load(
    {
        blog_id => 2,
        class => '*'
    },
    {
        join => MT->model('objectasset')->join_on(
            undef,
            {
                id => \'is null',
            },
            {
                type => 'left',
                condition => {
                    asset_id => \'= asset_id',
                },
            },
        ),
    }
);

これまでにMTQなどで、「ブログ記事に結びついていないアイテムをフィルタリングして、削除する機能が欲しい」という要望が上がっていました。
left joinが実装されたことで、この要望も実現できるはずです。
ちなみに、Changeset 6464の修正は、ブログ記事一覧の画面で、カテゴリに属さないブログ記事をフィルタリングする機能に関するものです。

拙作のプラグインでも、left joinができないために困ったことが過去にありました。
例えば、SuperSortプラグインでは、カテゴリに属さないブログ記事(およびフォルダに属さないウェブページ)を読み込むために、SQLを直接に書いて実行しています。
Movable Type 5.1対応版のSuperSortプラグインでは、この処理を変えて、ORMのleft joinを使おうと思います。

MT Cloud Starter Kit
Movable Typeのプラグイン集「MT Cloud Starter Kit」をぜひご利用ください