データ検索をマスターする! (3/6)
作成:2015-10-03 09:01
更新:2015-10-03 09:01
更新:2015-10-03 09:01
■QueryExpressionの利用
複雑な検索を行うとき、どうしてもネックとなるのがwhereメソッドです。ここで検索の条件を設定しますが、複雑になってくると何が何だかわからなくなってしまいがちです。
もっとオブジェクト指向らしく、すっきりとメソッドチェーンで呼び出していく感じで複雑な条件を作成できないか? もちろん、できます。それは、「QueryExpression」を利用するのです。
QueryExpressionは、名前の通り、クエリー表現を作成するための機能を提供するクラスです。これは、以下のようにして作成します。
このQueryExpressionには、条件を設定するためのメソッドがいろいろと用意されています。これらのメソッドを呼び出し、その結果を利用することで複雑な条件が作成できます(用意されているメソッド類については、後で触れます)。
では、「結果を利用する」とは、どこで? それは、whereメソッドで、です。whereメソッドは、条件となる値などを指定して呼び出していましたが、その他にQueryExpressionを指定することもできるのです。
では、簡単な利用例を挙げておきましょう。下のサンプルは、findメソッドを修正し、ageを使って検索するようにしたものです。例えば「20」と入力して送信すると、ageが20以上のものだけが検索されます。まぁ、そんなに複雑な検索ではありませんが、QueryExpressionを利用した検索のやり方はこれでわかるでしょう。
ここでは、あらかじめ$fncという無名関数を用意してあります。こういうものですね。
そして、実際に検索を行う際には、まずQueryとQueryExpressionをそれぞれ変数に代入しておきます。
もっとオブジェクト指向らしく、すっきりとメソッドチェーンで呼び出していく感じで複雑な条件を作成できないか? もちろん、できます。それは、「QueryExpression」を利用するのです。
QueryExpressionは、名前の通り、クエリー表現を作成するための機能を提供するクラスです。これは、以下のようにして作成します。
$変数 = 《Query》->newExpr();
このQueryExpressionには、条件を設定するためのメソッドがいろいろと用意されています。これらのメソッドを呼び出し、その結果を利用することで複雑な条件が作成できます(用意されているメソッド類については、後で触れます)。
では、「結果を利用する」とは、どこで? それは、whereメソッドで、です。whereメソッドは、条件となる値などを指定して呼び出していましたが、その他にQueryExpressionを指定することもできるのです。
では、簡単な利用例を挙げておきましょう。下のサンプルは、findメソッドを修正し、ageを使って検索するようにしたものです。例えば「20」と入力して送信すると、ageが20以上のものだけが検索されます。まぁ、そんなに複雑な検索ではありませんが、QueryExpressionを利用した検索のやり方はこれでわかるでしょう。
ここでは、あらかじめ$fncという無名関数を用意してあります。こういうものですね。
$fnc = function($exp, $find) {この関数は、QueryExpressionを$expに、そして検索テキストを$findにそれぞれ渡して呼び出すようにしてあります。この中で、QueryExpressionのgteというメソッドを使って検索条件を設定してあります(このメソッドについては後述)。
return $exp->gte('age', $find * 1);
};
そして、実際に検索を行う際には、まずQueryとQueryExpressionをそれぞれ変数に代入しておきます。
$query = $this->Persons->find();これで一通りの準備が整いました。実際の検索はwhereを使って行いますが、この引数に先ほどの無名関数$fncを指定してやればいいのです。
$exp = $query->newExpr();
$persons = $query->where($fnc($exp,$find));これで、$fnc関数の結果がwhereに引数として指定され、その結果、ageの値が$find以上のものだけが$personsに返される、というわけです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
public function find() { $persons = []; if ($this->request->is('post')) { $find = $this->request->data['find']; $query = $this->Persons->find(); $exp = $query->newExpr(); $fnc = function($exp, $find) { return $exp->gte('age', $find * 1); }; $persons = $query->where($fnc($exp,$find)); } $this->set('persons', $persons); $this->set('msg', null); }
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る