色々な検索方法1 #05
    こんにちわ!skinnyトラックを達成するとかんかんが焼き肉をおごってくれるんじゃないかと期待しているnekokakです!
五日目はDBIx::SkinnyでのDB検索の細かい使い方についてです。
search
DBIx::SkinnyにはDBICにあるようなsearchメソッドが用意されています。
my $itr = $db->search('user',
    { name => 'nekokak' },
    { }
);
一つ目に検索対象とするtable名を指定します
二つ目のhashrefに検索条件を指定します
三つ目のhashrefにorderやlimitなどのオプションを渡せます。
searchメソッドはメソッドの返り値をスカラーコンテキストで受けるかリストコンテキストでうけるかで
返り値の情報が変わりま。
スカラーコンテキストで受けた場合はDBIx::Skinny::Iteratorが取得でき、
リストコンテキストで受けた場合は結果Rowの配列を取得することができます。
色々な検索条件
searchメソッドで色々複雑な検索条件を指定したい場合があると思いますので
色々な例をあげましょう。
inで複数の値をつかって検索したい場合:
#SELECT id, name, birth_on FROM user WHERE (name IN (?,?,?))
$db->search('user',
    { name => [qw/nekokak yappo kan/] },
);
# もしくは
$db->search('user',
    { name => {in => [qw/nekokak yappo kan/]} },
);
not inで検索したい場合:
#SELECT id, name, birth_on FROM user WHERE (name NOT IN (?,?,?))
$db->search('user',
    { name => {'not in' => [qw/nekokak yappo kan/]} },
);
範囲指定で検索したい場合:
#SELECT id, name, birth_on FROM user WHERE (id < ?)
$db->search('user',
    {
        id => {'<' => '10'},
    }
);
#SELECT id, name, birth_on FROM user WHERE (id > ?)
$db->search('user',
    {
        id => {'>' => '10'},
    }
);
IS NOT NULLで検索したい場合:
#SELECT id, name, birth_on FROM user WHERE (name IS NOT NULL)
$db->search('user',
    {
        name => \'IS NOT NULL',
    }
);
and検索したい場合:
#SELECT id, name, birth_on FROM user WHERE (name = ?) AND (id < ?)
$db->search('user',
    {
        id   => {'<' => '10'},
        name => 'nekokak',
    }
);
同じカラムをand検索したい場合
# SELECT id, name, birth_on FROM user WHERE ((id < ?) AND (id > ?))
$db->search('user',
    {
        id => [-and => {'<' => 100},{'>' => 20}],
    }
);
#SELECT id, name, birth_on FROM user WHERE ((id = ?) AND (id = ?) AND (id = ?))
$db->search('user',
    {
        id => [-and => 1,2,3],
    }
);
同じカラムをor検索したい場合:
#SELECT id, name, birth_on FROM user WHERE ((name = ?) OR (name = ?))
$db->search('user',
    {
        name => [{'=' => 'nekokak'},{'=' => 'yappo'}],
    }
);
limit/offsetをかけたい場合:
#SELECT id, name, birth_on FROM user LIMIT 10 OFFSET 1
$db->search('user',
    {},
    {
        limit  => 10,
        offset => 1,
    }
);
order byをかけたい場合:
#SELECT id, name, birth_on FROM user ORDER BY id desc
$db->search('user',
    {},
    {
        order_by => { 'id' => 'DESC' },
    }
);
#SELECT id, name, birth_on FROM user ORDER BY id DESC, name DESC
$db->search('user',
    {},
    {
        order_by => [
            { 'id'   => 'DESC' },
            { 'name' => 'DESC' },
        ],
    }
);
このように色々な検索条件を指定できます。
DBICとは少しインタフェースが異なるので注意してください。
single
singleメソッドはレコードを1行だけ取得したい時に使用します。
my $row = $db->single('user', {id => 1});
一つ目に検索対象とするtable名を指定し、
二つ目のhashrefに検索条件を指定します。
singleメソッドでは二つ目の引数で設定した検索条件で複数レコードが取れる場合であっても
内部でlimit 1を自動で設定するようにしているので、
どのような場合でも1レコードしか取得しません。
DBIx::SkinnyではDBICのfindの用にプライマリキーで検索するメソッドを特別に用意していないので、
プライマリキーを検索する場合はsingleを用います。
count
レコードのcountを取りたい場合もあると思うので、countメソッドも用意してあります。
my $count = $db->count('user' , 'id', {name => 'nekokak'});
一つ目に検索対象とするtable名を指定し、
二つ目の引数がcountを取る対象となるカラム情報で
三つ目の引数がcountを取る条件となります。
明日は引き続きDBIx::Skinnyでのデータの検索方法について書きます。
have a nice skinny days!:)
