Teng で検索あれこれ
前回までの説明で、Teng を何となく使えるようになると思う。今回は Teng が提供する検索メソッドについて触れてなかった箇所についての説明をする。
Teng の検索メソッド
以下の4つのメソッドが提供されている。
- Teng#search
- Teng#single
- Teng#search_named
- Teng#search_by_sql
上2つのメソッドは、Teng で CRUD をしてみる - amari3のはてなダイアリー で説明しているのでこちらを参照ください。
また、説明に使用するテーブルやスキーマ等は、こちら Teng でリレーションを使う方法 - amari3のはてなダイアリー と同じものです。
Teng#search_named メソッド
Teng#search_named メソッドは生(に近い)SQL を記述する時に便利なメソッド。Teng::Iterator オブジェクトが返ってくる。
サンプルコードです。
my $it = $teng->search_named( q{SELECT * FROM entry WHERE ( id IN :ids )}, +{ ids => [2, 4] } );
少し見慣れない表記が含まれているけど、実際には以下の様な SQL 文になる。
SELECT * FROM entry WHERE ( id IN ( ?,? ) ) bind [2,4]
IN 演算子の値の個数が動的に変わる場合でも、呼び出し側は意識せずに利用できて便利。
Teng#search_by_sql メソッド
Teng#search_by_sql メソッドは生 SQL 文を記述することができる。Teng::Iterator オブジェクトが返ってくる。
サンプルコードです。
my $it = $teng->search_by_sql( q{SELECT * FROM entry WHERE id > ?}, [ 2 ] );
普通に SQL 文が記述できるので、難しいところは無いと思う。
Teng で WHERE 句の条件やソート条件
ここからは Teng で WHERE 句の条件の記述方法やソート条件の記述方法を説明をする。Teng でと銘打ってはいるけど、Teng のクエリビルダである SQL::Maker の機能の説明になるので、SQL::Maker のドキュメントもあわせて読むのが良いでしょう。
BETWEEN 演算子を使う
範囲検索でよく使う BETWEEN 演算子の記述方法です。
my $it = $teng->search(entry => +{ id => +{ between => [2, 4] } });
カラム名に、ハッシュリファレンスで条件を記述することになる。難しいところは無いと思う。『>』や『!=』等も基本的には同じように記述する。
ORDER BY 句を使う
検索結果のソートをする、order by の記述方法です。
my $it = $teng->search(entry => +{ id => +{ '>' => 2 }}, +{ order_by => 'id DESC' });
Teng#search メソッドの第3引数に記述することで実現できる。こちらも難しいところは無いと思う。
最後に
今回は検索メソッドについて、少しだけ踏み込んだ説明をしました。複雑な検索方法も分かってきたので、業務や趣味プログラムでそろそろ使いたいと思います。