Perl入門ゼミPerl入門ゼミテキスト処理、Linuxサーバー管理、Web開発ならPerlフォーラムへログインPerl›モジュール›データベース›DBIx::Custom›hereDBIx::Customで「動的にwhere句を作成」する方法DBIx::Customで「動的にwhere句を作成」する方法を解説します。動的なWhere句の生成DBIx::Customでは動的にWhere句を生成することができます。与えられたパラメータにtitleしか含まれていないければ、titleだけの条件が含まれたWhere句を生成して、パラメータにpriceしか含まれていないならば、priceの条件だけが含まれたWhere句を生成するということが簡単にできます。動的なWhere句生成の基礎DBIx::Custom::Whereオブジェクトの生成まずDBIx::Custom::Whereオブジェクトを生成します。DBIx::Customのwhereメソッドを使うと、DBIx::Custom::Whereオブジェクトを生成することができます。$dbi->where;Where句の設定clause属性を使って、Where句を記述します。:priceは名前付きプレースホルダーです。executeメソッドの解説を参照してください。:price']);配列のリファレンスを指定する必要があり、最初の要素は演算子になります。演算子は「and」と「or」を利用することができます。二つ目の要素以降は、条件を指定しますが、名前付きプレースホルダーを一つだけ含むようにする必要があります。条件がひとつだけの場合は文字列を指定することもできます。:title');この場合は次の記述と同じ意味になります。:title']);Where句の生成Where句を生成するには、to_stringメソッドを利用するか、DBIx::Custom::Whereオブジェクトを文字列として評価します。"$where";次のようなWhere句を生成することができます。:price動的なWhere句の生成Where句を動的に簡単に生成することができます。priceの条件だけを含んだWhere句を生成するにはparamのキーにpriceを含んだハッシュリファレンスのデータを渡します。"$where";次のようなWhere句が生成されます。:pricetitleの条件だけを含んだWhere句を生成するにはparamのキーにtitleを含んだハッシュリファレンスのデータを渡します。"$where";次のようなWhere句が生成されます。:titleどちらも含んでいない場合はWhere句は生成されず、空文字列を取得することができます。空文字列テーブル名を先頭に付加した列名を利用するテーブル名を先頭に付加した列名を利用することもできます。他のテーブルの列と区別する必要がある場合にも対応しています。同名の列を二つ以上含む場合たとえば比較の条件を書きたい場合は、同じ列名を含む条件を記述する必要があります。このような場合にも対応しています。パラメータには、値を配列のリファレンスで指定する必要があります。2000]});次のようなWhere句が生成されます。:price最初の条件だけを動的に生成したい場合は、次のようにします。配列のリファレンスの二つ目の要素に、存在しないことを示すDBIx::Custom::NotExistsオブジェクトをわたします。これはnot_existsメソッドで取得することができます。$dbi->not_exists]});次のようなwhere句が生成されます。:price二つ目の条件だけを動的に生成したい場合は、次のようにします。配列のリファレンスの一つ目の要素に、存在しないことを示すDBIx::Custom::NotExistsオブジェクトをわたします。2000]});次のようなwhere句が生成されます。条件を入れ子にしたような複雑な条件も記述することができます。"$where";次のようなWhere句が生成されます。:title)入れ子構造が複雑ななった場合でも正しく動的にWhere句を生成することができます。次のようなパラメータが渡された場合にも正しくWhere句を生成します。'Ruby']});配列のリファレンスには、二つしか値が含まれていませんので、次のようなWhere句が生成されます。名前付きプレースホルダーを含まない条件を記述することもできます。'Perl'"]);パラメーターの値にかかわらず、この条件は必ずwhere区に含まれることになります。or条件による検索or条件を使った検索を行うには次のようにします。DBIx::CustomではWhere条件が複雑になったときに、複雑なWhereを扱うためのDBIx::Custom::Whereオブジェクトが用意されています。whereメソッドを使用すると、適切に設定されたDBIx::Custom::Whereオブジェクトを新しく生成することができます。1500};$where->clause($clause);$where->param($param);以下はSQLiteを使ったサンプルになります。モデルも上手に使っているので、重複の少ないコードになっています。$result->all;Where句で日付の範囲を指定するデータベースである日付からある日付までのデータを取り出すというのはよくある操作です。両方の日付が指定される場合もありますし、片方の日付だけが指定される場合もあります。このような場合に自分で条件分岐を書くのはめんどうです。DBIx::Custom::Whereオブジェクトを利用すると、少し工夫するだけで記述することができます。$where);最初にwhereメソッドでDBIx::Custom::Whereオブジェクトを生成します。次にclauseで、Where句を記述します。これはDBIx::Customのタグを使って記述します。':date{<}'}]は以下のように展開されます。?これは動的なもので、たとえば開始時刻が与えられない場合は次のように展開されます。?次はパラメータの記述です。dateを二つ指定する必要があるので、配列のリファレンスで指定します。存在する場合はその値を、存在しない場合は、not_existsメソッドを使って、DBIx::Custom::NotExistsオブジェクトを指定します。]};$where->param($param);最後にselect区のwhereに作成したDBIx::Customオブジェクトを渡します。業務に役立つPerlログ解析など日本語を含むテキスト処理の実践!案内YouTubeでもっと簡単にプログラミングを学ぶならPerlゼミちゃんねるLinuxコマンドを学ぶならLinuxサーバー管理入門Webデザインを学ぶならWebデザイン入門Web開発を始めるななMojoliciousスタートアップブログを作るならGiblogプログラミングの勉強会ならPerl入学式お問合せはこちらPerlは、テキスト処理の記述性とパフォーマンスに優れ、正規表現が言語に組み込まれているプログラミング言語です。Linuxサーバー管理でのフィルタリングプログラム、複数行の文字列を処理、ファイル内容の検索・置換などが得意。Mojoliciousを使ったWebスタートアップも。Perlは、gitやopensslなどUnix/Linuxミドルウェアの支援ツールとして採用されています。このサイトはGiblogで製作されています。