データベース検索の基本 (2/5)
作成:2015-09-26 10:18
更新:2015-09-26 10:32
更新:2015-09-26 10:32
■findメソッドとwhereメソッド
では、検索について説明していきましょう。レコードの検索は、実は既にやっています。先にindexアクションを作成する際、こういうものを使いましたね。
これは、全レコードをエンティティ配列として取り出すものでした。find('all')というもので、すべてのエンティティを得ることができました。
この「find」というのが、検索の基本となるものです。indexでは引数に'all'を指定しましたが、引数無しで使うと、一般的な検索を行うためのメソッドとして機能します。
このfindは、「Query」というクラスのインスタンスを返値にします。Queryは、検索のための諸設定を管理するクラスです。このQueryにあるメソッドを呼び出すことで、検索の条件などを指定できます。
この「Queryを作成して細かな検索の条件を設定していく仕組み」は、CakePHP3に搭載されている「Query Builder」と呼ばれるものです。Queryを使って、「いかにして検索に関する設定を追加していくか」で複雑な検索を作成していくことができます。
この検索条件の設定で、もっとも基本となるメソッドは「where」というものでしょう。これは、以下のように記述します。
第1引数には、条件となる文を記述します。これは、条件式の「値以外の部分」といっていいでしょう。そして、値となるものが第2引数に指定されます。
例えば、「idが1のもの」なら、「id = 1」というように条件を設定します。この「1」より前の部分が第1引数、「1」が第2引数になります。「1」という数値の代りに、変数$idを使って値を指定するなら、
こんな感じになるわけですね。基本的に、条件となる文は、比較演算子(=<>といった記号で2つの値を比較するためのもの)を使った式をイメージするといいでしょう。
では、簡単なサンプルを下のリスト欄にあげておきましょう。これは、入力フィールドに書いたテキストをnameに含むレコードをすべて検索するサンプルです。例えば、「yamada」と書いて送信すると、名前に「yamada」を含むものがすべて検索されます。
ここでは、「名前(name)の中に、フォームで送信した値($find)が含まれているもの」を検索しています。whereの部分を見てみると、
このあたりは、SQLというデータベース言語の条件設定とほぼ同じになっています。SQLがわかる人なら、ここでの説明を読んで「なるほど……」とすぐに納得できたことでしょう。よくわからなかった人は、SQLについて別途調べてみると良いでしょう。
$this->Persons->find('all')
これは、全レコードをエンティティ配列として取り出すものでした。find('all')というもので、すべてのエンティティを得ることができました。
この「find」というのが、検索の基本となるものです。indexでは引数に'all'を指定しましたが、引数無しで使うと、一般的な検索を行うためのメソッドとして機能します。
このfindは、「Query」というクラスのインスタンスを返値にします。Queryは、検索のための諸設定を管理するクラスです。このQueryにあるメソッドを呼び出すことで、検索の条件などを指定できます。
この「Queryを作成して細かな検索の条件を設定していく仕組み」は、CakePHP3に搭載されている「Query Builder」と呼ばれるものです。Queryを使って、「いかにして検索に関する設定を追加していくか」で複雑な検索を作成していくことができます。
この検索条件の設定で、もっとも基本となるメソッドは「where」というものでしょう。これは、以下のように記述します。
《Query》->where( 条件文 , 値 );
第1引数には、条件となる文を記述します。これは、条件式の「値以外の部分」といっていいでしょう。そして、値となるものが第2引数に指定されます。
例えば、「idが1のもの」なら、「id = 1」というように条件を設定します。この「1」より前の部分が第1引数、「1」が第2引数になります。「1」という数値の代りに、変数$idを使って値を指定するなら、
《Query》->where('id = ', $id)
こんな感じになるわけですね。基本的に、条件となる文は、比較演算子(=<>といった記号で2つの値を比較するためのもの)を使った式をイメージするといいでしょう。
では、簡単なサンプルを下のリスト欄にあげておきましょう。これは、入力フィールドに書いたテキストをnameに含むレコードをすべて検索するサンプルです。例えば、「yamada」と書いて送信すると、名前に「yamada」を含むものがすべて検索されます。
ここでは、「名前(name)の中に、フォームで送信した値($find)が含まれているもの」を検索しています。whereの部分を見てみると、
where(["name like " => '%' . $find . '%'])こんな具合になっているのがわかりますね。この条件文を整理すると、ここで指定されている式はこうなります。
name like '%○○%'この○○の部分は、$findの値が嵌めこまれます。これは「LIKE検索(あいまい検索)」と呼ばれるもので、テキストを含むものを検索するのに用いられます。%記号はワイルドカード(どんな文字でも当てはまる)として働きます。もし、「○○で始まるもの」を取り出したければ、'○○%'とすればいいし、逆に「○○で終わるもの」なら、'%○○'と書けばいいわけですね。
このあたりは、SQLというデータベース言語の条件設定とほぼ同じになっています。SQLがわかる人なら、ここでの説明を読んで「なるほど……」とすぐに納得できたことでしょう。よくわからなかった人は、SQLについて別途調べてみると良いでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
public function find() { $persons = []; if ($this->request->is('post')) { $find = $this->request->data['find']; $persons = $this->Persons->find() ->where(["name like " => '%' . $find . '%']); } $this->set('msg', null); $this->set('persons', $persons); }
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る