DBIC::EscapeSearch
DBICのメソッド拡張ですが、ResultSetManagerを使えばラクチンでした。
ResultSetManagerが王道になるのかな。
参考:http://blog.hide-k.net/archives/2006/03/dbixclassresult.php
searchメソッド実行させるときにシングルクォートのエスケープさせたかったのですが、
Kittenでは例えばこんな感じ
eval {
$cap->stash->{memo} = __PACKAGE__->resultset('Memo')->search(
{
memo => {'like', '%'.&Kitten::Util::escapeDB($q->param('memo')).'%'}
},
{
page => $page,
row => 10,
order_by => 'id DESC',
}
);
};
&Kitten::Util::escapeDBが汚くて嫌だったのです。
シングルクォートのエスケープなんて意識せずにやって欲しいってのが本音。
ってことで、DBIC::EscapeSearchをサックリ作ってみました。
package DBIx::Class::EscapeSearch;
use strict;
use warnings;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/ResultSetManager/);
sub escape_search : ResultSet {
my $class = shift;
my $attrs = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
my $query = ref $_[0] eq 'HASH' ? { %{shift()} }: {@_};
$query->{$_} =~ s/'/''/g for keys %$query;
return $class->search($query, { %$attrs });
}
1;
こんなのできました。
↓見たいにload_componentsしてやればOK
__PACKAGE__->load_components(qw/EscapeSearch PK::Auto::SQLite Core/);
search_likeメソッドとか見ても結局はsearchメソッドへのラッパーになってるんですよね。
だからこんなのでいいのかなと。
(追記)こんな感じでかけるかね。
eval {
$cap->stash->{memo} = __PACKAGE__->resultset('Memo')->escape_search(
{
memo => {'like', '%'.$q->param('memo').'%'}
},
{
page => $page,
row => 10,
order_by => 'id DESC',
}
);
};