Techブログ

Tech blog

インターン生ブログ

CakePHPのfindメソッドにおける条件の指定

カテゴリ:インターン生ブログ

2020.06.18

このエントリーをはてなブックマークに追加

cakephpではデータベースからデータを取得する機能としてfindメソッドがあります。そのfindメソッドを用いて、検索条件を指定することでデータベースから自分の欲しいデータだけを自由に取り出せるようにfindメソッドを使いこなしましょう!

基本的な使い方

$this->Articles->find()->all();

上記により、まとめてデータを取得することができます。

where

条件の指定を行うために、whereを使用することができます。

$this->Articles->find()->where()->all();

whereの引数には基本の条件を指定することができ、例えば

where([‘name’ => ‘sato’])

を指定することで’name’行が’sato’であるものを検索することができます。

配列に複数の条件を指定することができ、’AND’を用いて全てを満たす条件、’OR’を用いてどちらかを満たす条件を記述することができます。また、それらを組み合わせることによって複雑な検索条件も指定することができます。

LIKE

検索条件に完全に一致しない場合にもデータを取り出すことができるメソッドとしてLIKEがあります。英語で’〜のような’という意味です。nameにsatoが含まれる場合は、’name LIKE’=>’%sato%’ ,nameがsatoで始まるデータは’name LIKE’=>’sato%’で指定することができます。

IN と NOT IN

一つのカラムに対して複数の条件で検索する場合にはIN句を用います。

[‘name IN’=>[‘sato’,’kato’,’saito’]]

上記のように記述することでnameがsato,kato,saitoのデータを取り出すことができます。

また、複数の条件に該当しない場合のデータを取り出すにはNOT IN句を用いて下記のように表せます。

[‘NOT’=>[‘name IN’=>[‘sato’,’kato’,’saito’]]]

selectとorder

検索した多数のエンティティをどういう形で受け取るかを指定する機能として’select’と’order’があります。

select

selectメソッドは取り出すフィールドを指定します。

select([ field1, field2, …])

order

検索結果を出力する際に、並び順を指定しないと基本的にIDの順番通りに取り出されます。しかし、特定の順番に並べ替えたい場合はこのメソッドを使用します。

order( [ field名 => ‘Asc’ または ‘Desc’ ] )

引数には基準となるフィールド名に Asc(昇順) または Desc(降順) のいずれかを指定します。

limitとoffset

findによる検索のあと、データの個数が大量である時などは全部まとめて出力する必要がない時もあると思います。そのような時は必要な部分のデータを部分的に取り出すことが必要になります。そのような時に使用する二つのメソッドを紹介します。

limit

limit( 整数 );

取り出すデータの個数を引数に整数で指定します。もしデータの個数の方が指定した個数よりも少ない場合には存在するデータの個数しか出力されないので注意しましょう!

offset

offset( 整数 );

このメソッドは検索したデータの最初からではなく、指定した途中からデータを取り出すためのものです。引数に指定した整数の+1した数が指定されたデータの順番になります。例えば9を引数として入力すると、指定されるのは10番目のデータになります。

組み合わせ

いくつか紹介しましたが全てを組み合わせると下記のような表記になります。

$this->Persons->find()->select()->order()->offset()->limit()->where();

whereによる条件の例

このセクションでは構成したい条件の作り方を例を上げながら説明していきます。where()の引数の中の配列を表していて、AやBのような文字は、’title’ => ‘POST’ のような条件を表します。

A かつ (B または C)

[A ,’OR’=>[B,C]]

これは配列の中に’かつ’の条件であればANDを明記する必要はないので、上記のような記述になります。

(A かつ B)または(C または not D)

 [‘OR’=>[‘AND’=>[A,B],’OR’=>[C,’NOT’=>[D] ] ]

少し複雑ですが、このような表記になります。また、AかつBの’AND’を省略して下のようにも表せます。

 [‘OR’=>[[A,B],’OR’=>[C,’NOT’=>[D] ] ]

(A または B)かつ (C または not D)

[‘OR’=>[A,B],’AND’=>[‘OR’=>[C ,’NOT’=>[D] ] ] ]

これについて、真ん中のANDが不要に思えるかもしれませんが、連想配列のキーに同じ文字列を指定することができないため、一旦不必要ではあるANDを挟んで表しています。

コツ

僕が訳がわからなくならないように考えているのは、一番大きな枠組みから考えることです。例えば一番最後の例では、(AまたはB) と (Cまたはnot D) を’かつ’ で結んでいるのが一番大きな枠組みであるので最初は’AND’になります。(記述は不要)

おそらくコツを掴めばそこまで深く悩むことはないと思われるので、たくさん練習してデータを取り出すことができるようになってください!

一覧へ戻る

記事をカテゴリから探す