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

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

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

■QueryExpressionで使えるメソッド

では、このQueryExpressionクラスには、検索条件を設定するためにどんなメソッドが用意されているのでしょうか。

これらのメソッドは、基本的にwhere内に条件として用意される演算記号(比較演算子)を使った式と同等の働きをする、と考えてよいでしょう。最終的にデータベース・アクセスはSQLのクエリーとして実行されます。したがって、ある程度SQLがわかる人なら、「どういうSQLのクエリーが生成されるのか」が頭に入っていれば、これらのメソッドの使い方もすぐに理解できるでしょう。

では、それぞれのメソッドを、演算記号(生成されるクエリーの式)と関連付けてまとめておきましょう。

●=, !=演算子
eq( フィールド , 値 )
notEq( フィールド , 値 )
指定したフィールドの値が等しい、あるいは等しくない、という場合に用いる「=」「!=」といった演算器号に相当するのが「eq」「notEq」メソッドです。例えば、 eq('name','taro') というのは、「where 'name' = 'taro'」といったクエリーと同じものと考えればよいでしょう。

●>, >=演算子
gt( フィールド , 値 )
gte( フィールド , 値 )
「フィールド > 値」あるいは「フィールド >= 値」というように、そのフィールドの値が、引数の値より大きいものを検索するためのものです。

●<, <=演算子
lt( フィールド , 値 )
lte( フィールド , 値 )
「フィールド < 値」あるいは「フィールド <= 値」というように、そのフィールドの値が、引数の値より小さいものを検索するためのものです。

●= null, != null
isNull( フィールド )
isNotNull( フィールド )
これは、指定したフィールドの値がnullかどうかをチェックするためのものです。例えば、isNotNull('name')とすれば、nameフィールドがnullではないものだけを検索します。

●like, notLike演算子
like( フィールド , 値 )
notLike( フィールド , 値 )
あいまい検索(LIKE検索)を行うためのものです。例えば、like('name','%ko') とすれば、「name like '%ko'」という条件式(nameの値が'ko'で終わるもの)になります。

●in演算子
in( フィールド , 配列 )
フィールドの値が、用意した配列の値のいずれかと等しいものを検索するためのものです。例えば、 in('name',['taro','jiro','hanako']) とすれば、「'name' in ('taro','jiro','hanako')」といったクエリーと同じ働きをするようになります。


――では、これらの利用例を下にあげておきましょう。ここでは、入力フィールドにカンマで区切って複数の名前を記入すると、それらのエンティティを全て取り出す、ということを行っています。この際、「namenullでないか?」「mailnullでないか?」「ageの値がゼロより大きいか?」といったこともチェックして、すべてをクリアしたエンティティだけが取り出されるようになっています。

$fncに用意されている内容を見ると、メソッドチェーンを使って、「isNotNull」「gt」「in」といったメソッドを次々と呼び出していることがわかるでしょう。このようにして、より細かな検索条件の設定が行える、というわけです。

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

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, $f) {
            return $exp
                ->isNotNull('name')
                ->isNotNull('mail')
                ->gt('age',0)
                ->in('name', explode(',',$f));
        };
        $persons = $query->where($fnc($exp,$find));
    }
    $this->set('persons', $persons);
    $this->set('msg', null);
}

※関連コンテンツ

「初心者のためのCakePHP3 プログラミング入門」に戻る