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の本質であると勝手に思っている。