【CakePHP入門】関連するテーブルデータを検索する方法(contain)

こんにちは!フリーエンジニアのせきです。

CakePHPには、テーブルデータを検索する時に、関連するテーブルデータも一緒に取得する方法があります。

この記事では、

・containとは何か知りたい
・containで関連するテーブルデータを検索する方法を知りたい

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

・containで条件を指定して検索する方法を知りたい

といった応用的な内容に関しても解説していきます。

今回はそんな関連するテーブルデータを検索する方法について、わかりやすく解説します!

containとは

containとは、テーブルデータを検索する時に、関連するテーブルデータも一緒に取得することができる機能です。

ただデータが取得できるだけでなく、取得する列を指定したり、条件を指定したりすることもできます。

今回は、book_categoriesテーブルbooksテーブルの2つのテーブルを使ってcontainの動きを確認していきます。

booksテーブルはカテゴリIDをデータに持ち、そのカテゴリはbook_categoriesテーブルで管理されているものとします。

book_categoriesテーブルのテーブル定義

book_categoriesテーブルの初期データ

idnameinsert_date
1数学2015-01-20
2物理2016-01-01
3プログラミング2017-12-20

booksテーブルのテーブル定義

booksテーブルの初期データ

idtitlebook_category_id
1線形代数入門1
2力学2
3量子論2
4PHP入門3
5Javaプログラミング3

それぞれのModelを作成しておきます。

book_categoriesテーブルのModel

src\Model\Entity\BookCategory.php

src\Model\Table\BookCategoriesTable.php

booksテーブルのModel

src\Model\Entity\Book.php

src\Model\Table\BooksTable.php

booksテーブルとbook_categoriesテーブルは、1つのカテゴリIDに対し複数のbooksデータが存在するので、「多対1」という関係になります。

「多対1」の関連はbelongsToで定義できるので、BooksTableには「$this->belongsTo(‘BookCategories’);」の記述が必要になります。

containの基本的な使い方

全列を取得する

booksテーブルと、それに関連するbook_categoriesテーブルのデータをcontainを使って検索します。

containは、検索するfindメソッドのオプションとして指定する方法と、クエリオブジェクト(SQLを実行するためのオブジェクト)のメソッドとして記述する方法があります。

findメソッドのオプションとして指定する場合は、BooksのControllerに以下のように記述します。

クエリオブジェクトのメソッドとして記述する場合は、BooksのControllerに以下のように記述します。

ControllerTemplateを作成し、確認してみます。

Controllerです。

containをメソッドとして記述する方法を使っています。

src\Controller\BooksController.php

Templateです。

src\Template\Books\index.ctp

表示してみます。

http://[サーバ名]/[プロジェクト名]/books/
001

book_categoriesテーブルのすべての列が取得できています。

列を指定して取得する

containを使って他のテーブルデータを取得する時、必要な列だけ取得することもできます。

以下は、id列とname列を取得する記述方法です。

containの引数に渡す配列に「’テーブル名’ => function($q){}」のように関数を指定すると、$qでcontain先のテーブルのクエリオブジェクトを使うことができます

そのため、「$q->select([‘id’, ‘name’])」でid列とname列が取得されます。

BooksControllerを以下のように修正し、表示してみます。

002

カテゴリIDとカテゴリ名は取得しているので表示され、カテゴリ登録日は表示されていません。

containの応用的な使い方

条件を指定して検索する

containを使って取得した他のテーブルデータを、元のテーブルの検索条件に指定することができます

カテゴリ登録日が’2016-01-01’であるBooksテーブルのデータを取得します。

whereメソッドでBookCategoriesテーブルの’insert_date’を使用することができます。

表示するとinsert_dateが’2016-01-01’であるデータが表示されます。

003

‘id’のように2つのテーブルで同じカラム名がある場合は、「テーブル名.カラム名」の形で指定してください。

以下は、BookCategoriesのidが3のデータを取得します。

BookCategoriesのid列を「BookCategories.id」と記述しています。

表示するとBookCategoriesのidが3のデータが表示されます。

004

まとめ

今回は関連するテーブルデータを検索する方法について解説しました。

複数のテーブルを使用するシステム開発では、関連データの取得は必須です。

関連するテーブルデータを検索する方法を忘れてしまったら、この記事を思い出して下さい!

自分にプログラミングなんて・・・と思っていませんか?

今後10年間で今ある職業の『77%』はなくなると言われています。

人工知能や機械学習を筆頭にVR、AR、ドローンなどの最先端技術の発達はこれからのあなたの働き方に間違いなく影響を与えるでしょう。

将来を見据えてプログラミングができるようになってエンジニアになりたい、自分だけにしかできないクリエイティブな仕事がしたい、、、とお考えの方も少なくないでしょう。

と、同時に「難しそう、、自分にはできないだろう、、、」と諦めている方も多いのではないでしょうか。

弊社マンツーマンレッスンは、お一人お一人に専属のインストラクターがつくので、通常のスクールでは難しい、オリジナルアプリ開発や、フリーランスとしての仕事獲得まで支援しています。

まずは『無料体験レッスン』で弊社コンサルタントと一緒にあなた専用の学習カリキュラムを考えてみてはいかがでしょうか?

詳しくは下の画像をクリックしてください。

cta_mtm2

LINEで送る
Pocket

書いた人

せき

せき

フリーランスでWebシステム開発やゲーム開発をしています。
読者の方にプログラミングの面白さをお伝えしたいです。

おすすめコンテンツ

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

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