libro
www.tuyano.com
初心者のためのCakePHP3 プログラミング入門

データ検索をマスターする! (3/6)

作成:2015-10-03 09:01
更新:2015-10-03 09:01

■QueryExpressionの利用

複雑な検索を行うとき、どうしてもネックとなるのがwhereメソッドです。ここで検索の条件を設定しますが、複雑になってくると何が何だかわからなくなってしまいがちです。

もっとオブジェクト指向らしく、すっきりとメソッドチェーンで呼び出していく感じで複雑な条件を作成できないか? もちろん、できます。それは、「QueryExpression」を利用するのです。

QueryExpressionは、名前の通り、クエリー表現を作成するための機能を提供するクラスです。これは、以下のようにして作成します。
$変数 = 《Query》->newExpr();

このQueryExpressionには、条件を設定するためのメソッドがいろいろと用意されています。これらのメソッドを呼び出し、その結果を利用することで複雑な条件が作成できます(用意されているメソッド類については、後で触れます)。

では、「結果を利用する」とは、どこで? それは、whereメソッドで、です。whereメソッドは、条件となる値などを指定して呼び出していましたが、その他にQueryExpressionを指定することもできるのです。

では、簡単な利用例を挙げておきましょう。下のサンプルは、findメソッドを修正し、ageを使って検索するようにしたものです。例えば「20」と入力して送信すると、ageが20以上のものだけが検索されます。まぁ、そんなに複雑な検索ではありませんが、QueryExpressionを利用した検索のやり方はこれでわかるでしょう。

ここでは、あらかじめ$fncという無名関数を用意してあります。こういうものですね。
$fnc = function($exp, $find) {
    return $exp->gte('age', $find * 1);
};
この関数は、QueryExpression$expに、そして検索テキストを$findにそれぞれ渡して呼び出すようにしてあります。この中で、QueryExpressiongteというメソッドを使って検索条件を設定してあります(このメソッドについては後述)。

そして、実際に検索を行う際には、まずQueryQueryExpressionをそれぞれ変数に代入しておきます。
$query = $this->Persons->find();
$exp = $query->newExpr();
これで一通りの準備が整いました。実際の検索はwhereを使って行いますが、この引数に先ほどの無名関数$fncを指定してやればいいのです。
$persons = $query->where($fnc($exp,$find));
これで、$fnc関数の結果がwhereに引数として指定され、その結果、ageの値が$find以上のものだけが$personsに返される、というわけです。

※プログラムリストが表示されない場合

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 プログラミング入門」に戻る