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


MT::Objectで'like'を使った検索や絞り込みを行う。


公開日 : 2008-10-26 07:56:38


MT4.2(多分4.1でも出来ると思う)のMT::Objectではlike,not_like,<=なんかを使ってオブジェクトを検索したり絞り込んだりできます。ドキュメントにも書いてある(4.1では書いてない)。

MTOS-4.22-ja/lib/MT/Object.pm

This selects all I<MT::Foo> objects where foo == 'bar'. But you can provide
a hashref value to provide more options:

    my @foo = MT::Foo->load( { foo => { like => 'bar%' } });

This selects all I<MT::Foo> objects where foo starts with 'bar'. Other
possibilities include 'not_like', 'not_null', 'not', 'between', '>',
'>=', '<', '<=', '!='. Note that 'not' and 'between' both accept an
arrayref for their value; 'between' expects a two element array, and
'not' will accept an array of 1 or more values which translates to
a 'NOT IN (...)' SQL clause.

I<¥%arguments> should be a reference to a hash containing parameters for the
search. The following parameters are allowed:

例えば、本文に「Movable Type」を含むエントリーを検索するのであれば以下のように書けます。


my @entries = MT::Entry->load( { text => { like => '%Movable Type%' } });

例としてMTEntriesでtarget(カラム名), operator(条件), query(クエリ)を指定して絞り込めるようにしてみました。あくまでもサンプル。


<mt:entries target="text" operator="like" query="%Movable Type%">

MTOS-4.22-ja/lib/MT/Template/ContextHandlers.pm


8139a8140,8146
>         my $target = $args->{target};
>         my $operator = $args->{operator};
>         my $query = $args->{query};
>         if (($target) && ($operator =~ /^not_like|like|not|not_null|not|>|>=|<|<=|!=$/i)) {
>             $terms{$target} = { $operator => $query };
>         }
>

一応? プラグインにしたものも置いておきます。

追記:インデックス・アーカイブでしか有効になりません。

'between' ではarrayrefが渡せるようなことが書いてるのですが、以下のようなコードではうまく取得できなかった...のでもうちょっと調べてみることにします。


my @query = [1,10];
my @entries = MT::Entry->load( { id => { between => \@query } });

いずれにしても色々な絞り込みがやりやすくなりますね。

[関連記事]→ MT::ObjectこそがMTの本質であると勝手に思っている。

カテゴリ


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

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