#08 search

2011-12-08

今日はsearchメソッドを紹介します。

まず、searchメソッドはsingleのようにPRIMARY KEYで1行取得するわけではないが、
そんなに複雑じゃない場合に利用するといいと思います。

my $itr = $teng->search('user', +{name => 'nekokak'}, +{order_by => 'id'});
# SELECT * FROM user WHERE name = 'nekokak' ORDER BY id;

のように利用します。

こうすることでnameがnekokakな人をまとめて取得しイテレータ経由でレコードにアクセス出来るようになります。
また、第三引数にオプションを指定でき、ORDER BYなどを指定すことが可能です。

LIMIT / OFFSETを指定したい場合は

my $itr = $teng->search('user', +{name => 'nekokak'}, +{limit => 1, offset => 1,});
# SELECT * FROM user WHERE name = 'nekokak' LIMIT 1 OFFSET 1;

といったように指定することができます。

TengのsearchメソッドはSQL::Makerのselectメソッドのラッパーになっていますので
詳細はそちらを参照していただくほうがよいでしょう。


searchメソッドやsearch_by_sqlメソッドなどTeng::Iteratorが取得されるメソッドは
コンテキストによってイテレータ以外の値を取得することも可能です。

たとえば

my $itr = $teng->search('user', +{name => 'nekokak'}, +{order_by => 'id'});

このようにsearchメソッドの受け取りがscalarの場合はTeng::Iteratorが返されますが、

my @rows = $teng->search('user', +{name => 'nekokak'}, +{order_by => 'id'});

このようにarrayで結果を受け取ろうとすると、内部で$itr->allが実行された結果が返されることになります。

イテレータが不要でarrayで結果を受け取りたい場合はarray contextでsearc系メソッドを実行するとよいでしょう。


明日はupdate / deleteメソッドを紹介します。