【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

まとめ

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

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

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

LINEで送る
Pocket

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

cta_under_bnr

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

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

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

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

書いた人

せき

せき

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

おすすめコンテンツ

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

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