Movatterモバイル変換


[0]ホーム

URL:


EasyRamble は、技術ネタや子育て、英語学習、アウトドアなどについて綴るブログです。Ruby on Rails や Swift などで、Webサービス/アプリを作っています。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespaceApp\Controller;
 
useCake\ORM\TableRegistry;
 
classHomeControllerextendsAppController
{
    publicfunctionindex(){
        $posts_table=TableRegistry::get('Posts');
        $posts=$posts_table
            ->find()
            ->contain(['Users'])
            ->order(['Posts.created'=>'DESC']);
        $this->set('posts',$posts);
    }
}

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

1
2
3
 
SELECT ... FROM posts INNER JOIN users ON users.id = posts.user_id
 

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

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

src/Template/Home/index.ctp

1
2
3
4
5
<?phpforeach($postsas$post):?>
    <p><?=$post->user->name;?></p>
    <p><?=$post->title;?></p>
    <p><?=$post->content;?></p>
<?phpendforeach;?>

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

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

src/Controller/UsersController.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespaceApp\Controller;
 
useApp\Controller\AppController;
 
classUsersControllerextendsAppController
{
    publicfunctionview($id=null)
    {
        $user=$this->Users->get($id,[
            'contain'=>['Posts']
        ]);
        $this->set('user',$user);
        $this->set('_serialize',['user']);
    }
}

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

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

1
2
3
4
 
SELECT ... FROM users WHERE users.id = 5 LIMIT 1
SELECT ... FROM posts WHERE posts.user_id in (5)
 

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

src/Template/Users/view.ctp

1
2
3
4
5
6
<p><?=$user->name;?></p>
 
<?phpforeach($user->postsas$post):?>
    <p><?=$post->title;?></p>
    <p><?=$post->content;?></p>
<?phpendforeach;?>

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

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
CakePHP3 ビギナーズガイド: 最新のPHPフレームワークをマスターせよ! PRIMERシリーズ (libroブックス)
プログラミングPHP 第3版
>> 次の記事 :
<< 前の記事 :
 
follow us in feedly
スポンサーリンク
スポンサーリンク

Leave Your Message!コメントをキャンセル









【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
GitHub: takafumir
Twitter: @taka222
Facebook
Ruby on Rails で Web サービスを作っています。Twitter で英語学習中の親バカ。

- Ruby / Ruby on Rails
- PHP / CakePHP
- WordPress カスタマイズ / テーマ作成
- Swift / iOS アプリ / Chrome 拡張
など開発業務の受託案件もお引き受けしています。お仕事のご依頼、ご相談はお問い合わせページからお願いいたします。お気軽にどうぞ!


Copyright(c) EasyRamble All Rights Reserved.

[8]ページ先頭

©2009-2025 Movatter.jp