CakePHPでDB関連テーブルのレコード・データを取得

スポンサーリンク

CakePHP 3 の開発で、データベースの関連テーブル(アソシエーション)のレコード・データを取得する方法です。クエリーを作成する時に、明示的に contain を使って、データを取得する関連テーブルを指定する必要があります。

— 環境 —
PHP 5.5.19
CakePHP 3.1.1

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

以降の説明は、User has many Posts / Post belongs to User となっているアソシエーション関係での例です。

Posts に関連する Users のデータを取得する

Posts 一覧に関連する Users を同時に引っ張ってくる例です。

src/Controller/HomeController.php

上記のように contain に Users を指定してクエリを作成すると、Posts テーブルに関連する Users のデータを取得できます。なお contain を使うと、Sql Log を確認したところ、INNER JOIN による SQL が発行されることを確認しました。

また、order 句の指定では、created カラムが Posts テーブルにも Users テーブルにも存在するので、’Posts.created’ とソートに指定したいテーブル.カラム名を明示する必要がある。

ビューでは以下のように、$post->user で投稿ユーザーにアクセスできます。

src/Template/Home/index.ctp

User に関連する Posts のデータを取得する

今度は逆に特定の User に関連する Posts のレコードを同時に引っ張ってくる例です。User が投稿した Posts を取得します。

src/Controller/UsersController.php

contain に Posts を指定することで、User に関連する Posts を取得できます。

Sql Log を確認したところ、以下の SQL が発行されていました。

ビューでは以下のように、$user->posts とすれば、ユーザーが投稿したポスト一覧にアクセスできます。

src/Template/Users/view.ctp

以上、CakePHP 3 で contain を使っての関連テーブルのデータを取得する方法でした。

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
 
スポンサーリンク

Leave Your Message!