【CakePHP入門】findでエンティティを検索し取得する方法

こんにちは!フリーランスの長野です。

findって使ってますか?

findはデータベースを検索してデータを取得する際に使われます。

この記事では、findについて

・findとは
・findの基本的な使い方

という基本的な内容から、

・findの応用的な使い方

など応用的な内容についても解説していきます。

今回はfindについて、使い方をわかりやすく解説します!

findとは

findとはエンティティを検索してデータを取得するためのメソッドです。

エンティティとはデータベースに用意されているテーブルのデータをPHPクラス用に抽象化したものです。

CakePHPでは、データベースに保存したり取り出したりしたデータは、エンティティのインスタンスになります。

したがって、findはデータベースのテーブルを検索してデータを取得する際に使用します。

findの基本的な使い方

findは下記のように記述して使用します。

findの記述方法:

第1引数には’all’‘list’などを指定します。

・’all’ 全データを取得
・’list’ レコードのリストを取得

第2引数には連想配列で’limit’‘conditions’などのオプションを設定します。

それではまずは第1引数に’all’や’list’などを指定する方法について確認していきましょう。

allで全データを取得する方法

findメソッドの第1引数に’all’を指定すると、全データを取得することができます。

サンプルコードで確認していきましょう。

なお、サンプルコードでは下記のSQLクエリで作成したテーブル「persons」を使用しています。

SQLクエリ:

personsテーブル:

idnameagemail
1Taro40[email protected]
2Jiro30[email protected]
3Saburo25[email protected]
4Hanako35[email protected]

テーブル「persons」を作成後、bakemodelを作成しています。

bakeの実行例(linux):

findメソッドの第1引数に‘all’を使用して全データを取得するソースコード「/src/Controller/PersonsController.php」は下記のとおりです。

URL「/persons/index」を指定した場合に、findメソッドで取得したデータを表示するように記述しています。

URL「/persons/index」のテンプレートは「/src/Template/Persons/index.ctp」で記述しています。

/src/Controller/PersonsController.php:

/src/Template/Persons/index.ctp:

実行結果 URL「/persons/index」:
20170707ListPerson

この場合は、入力した全てのデータが表示されています。

なお、先ほどbakemodelを作成しました。

bakeの詳しい説明についてはこちらを参照してくださいね。

【CakePHP入門】bakeの使い方
更新日 : 2019年4月20日

listでリストを配列で取得する方法

findメソッドの第1引数に’list’を指定すると、レコードのリストを配列で取得することができます。

‘list’を指定する際に、第2引数の連想配列で‘keyField’‘valueField’オプションを使うことで、取得する配列のキーと値に使われるフィールドを設定することも出来ます。

サンプルコードで確認していきましょう。

このサンプルコードでは、findメソッドの第2引数の連想配列に‘limit’を指定してリストの取得数を指定しています。

また、‘keyField’‘valueField’オプションを使い、取得する配列のキーと値を設定しています。

/src/Controller/PersonsController.php:

/src/Template/Persons/index.ctp:

実行結果 URL「/persons/index」:
20170707ListPerson2

findメソッドの第2引数の連想配列に‘limit’を指定してリストの取得数を3に指定していますので、1つ目の表には3つのレコードのデータが表示されています。

また、リストの配列もあわせて表示しています。

なお、データとしてフィールド’name’の値が表示されています。

これはmodelをbakeした際に生成された「src/Model/Table/PersonsTable.php」の記述でdisplayFieldメソッドの引数が’name’で指定されているためです。

注意しましょう!

また、‘keyField’‘valueField’オプションを使い、取得する連想配列のキーを’name’に、値を’mail’に設定しているので、2つ目の表には‘mail’の値が表示されています。

こちらもリストの配列をあわせて表示しています。

src/Model/Table/PersonsTable.php:

findの応用的な使い方

findメソッドは第2引数の連想配列でオプションを設定することができます。

また、findメソッドの後ろに「->」(アロー演算子)を使ってオプションを設定することもできます。

firstで1つ目の結果を取得する方法

findメソッドの後ろに「->」(アロー演算子)を使ってfirstを記述することで1つ目の結果を取得することができます。

firstの記述方法:

それではサンプルコードで確認していきましょう。

/src/Controller/PersonsController.php:

/src/Template/Persons/index.ctp:

実行結果 URL「/persons/index」:
20170707ListPerson3

このサンプルコードではfind(‘all’)で全てのデータを取得し、firstを使って1つ目のデータを取得し表示しています。

firstの他にも、lastを使用すると最後のデータを取得することができます。

また、countを使用するとレコード数を取得することができます。

conditionsで条件を設定する方法

findメソッドの第2引数の連想配列のキーに‘conditions’を指定することで条件を設定してデータを取得することができます。

それではサンプルコードで確認していきましょう。

/src/Controller/PersonsController.php:

/src/Template/Persons/index.ctp:

実行結果 URL「/persons/index」:
20170707ListPerson4

このサンプルコードではデータベースのテーブル「persons」のフィールド’name’の値で「ro」が含まれるデータを取得し表示しています。

containで関連テーブルからリストを生成する方法(Joinの代替方法)

CakePHP2.xなどでは「JOIN」句を使って関連するテーブルを結合していましたが、CakePHP3.xでは関連テーブルからリストを生成するためにcontainを使用します。

containの記述方法:

それではサンプルコードで確認していきましょう。

前述のテーブル「persons」にカラム「job_id」を追加します。

personsテーブル:

idnameagemailjob_id
1Taro40[email protected]1
2Jiro30[email protected]2
3Saburo25[email protected]3
4Hanako35[email protected]4

関連するテーブルとして「jobs」を作成します。

SQLクエリ:

jobsテーブル:

idname
1teacher
2policeman
3doctor
4nurse

テーブル「jobs」を作成後、bakemodelを作成しています。

bakeの実行例(linux):

/src/Controller/PersonsController.php:

/src/Template/Persons/index.ctp:

またテーブル「src/Model/Table/PersonsTable.php」にbelongsToを使って関連するテーブルを指定する記述を行う必要があります。

src/Model/Table/PersonsTable.php:

実行結果:
20170707ListPerson5

このサンプルコードではテーブル「persons」とテーブル「jobs」のフィールド「job」を結合して表示しています。

まとめ

ここでは、findの使い方について説明しました。

findデータを検索して取得し使用する場合によく使われます。

使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説