質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

1947閲覧

cakephp3 アソシエーションしたタグとキーワードを一覧画面に表示したい

holic

総合スコア134

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2017/07/22 11:52

編集2017/07/22 12:00

###前提・実現したいこと
アソシエーションしたタグとキーワードを一覧画面に表示したい。
完成させたいfigを載せます
イメージ説明

●テーブルの準備とbake処理

blogsテーブル

idtitledata
1ブログのタイトルその12017/06/30
2ブログのタイトルその22017/07/13
3ブログのタイトルその32017/07/20

tagsテーブル

idtitle
1日記
2仕事
3休日

keywordsテーブル

idtitle
1天気
2
3
4占い
5上位
6温泉

blogs_tagsテーブル

blog_idtag_id
11
12
21
33
41
42

blogs_keywordsテーブル

blog_idkeyword_id
11
12
13
24
25
36

[blogs][tags][keywords]に関してbake allで自動生成させました。
ここで
/test/blogs/view/1
とレンダリングしたときに(イメージ画像を下に載せます)
blogsのid=1の記事の詳細内容が表示されます。
そして[tags][keywords]テーブルでアソシエーションされた内容も記述されます。
イメージ説明

このようにアソシエーションされた内容を記事一覧ページ
/test/blogs/
をレンダリングさせたときにも表示させたいのです。
bakeしたそのままの状態でしたら
blogsテーブルの中身だけの一覧が表示されます、
つまり、idとtitleとdataこれにプラスして
アソシエーションさせた情報つまり「タグ」「キーワード」情報も表示させたいです。
ご教示お願い致します。

現在のBlogsController.php(indexとviewの部分)を記します

php

1 public function index() 2 { 3 $Blogs = $this->paginate($this->Blogs); 4 5 $this->set(compact('Blogs')); 6 $this->set('_serialize', ['Blogs']); 7 } 8 9 public function view($id = null) 10 { 11 $Blog = $this->Blogs->get($id, [ 12 'contain' => ['Keywords', 'Tags'] 13 ]); 14 15 $this->set('blog', $blog); 16 $this->set('_serialize', ['blog']); 17 }

###補足情報(言語/FW/ツール等のバージョンなど)
cakephp3系

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のようにpaginateの設定のcontainを指定すると、関連データも取得できますよ。あとはTemplate側で出力すればよいだけです。

public function index() { $this->paginate = [ 'contain' => ['Keywords', 'Tags'] ]; $Blogs = $this->paginate($this->Blogs); $this->set(compact('Blogs')); $this->set('_serialize', ['Blogs']); }

投稿2017/07/22 23:41

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

holic

2017/07/23 06:20 編集

まさかpagenateの箇所とは想像しませんでした。icchiiさんいつも大変に勉強になります。 この手法についてCookbookに記載されておりました。 https://book.cakephp.org/3.0/ja/controllers/components/pagination.html#join ここでの記述は $this->paginateの記述のあとに $this->set('articles', $this->paginate($this->Articles)); } と$this->paginateをsetしている文をお見受けしましたが、今回はこのset文入らないのでしょうか。
popobot

2017/07/23 07:22 編集

質問に掲載されているコード`$this->set(compact('Blogs'));`はすでにsetしているので、追加では必要ないと思います Template側では`$Blogs->keywords[0]->title`などで参照できるとはずです。
holic

2017/07/23 12:02

補足ありがとうございます。 ベストアンサーとさせていただきます。いつもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問