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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

Q&A

解決済

1回答

1050閲覧

CakePHP containした関連テーブルのデータがVIEW側で表示できない

Ryota.I

総合スコア22

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

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

0グッド

0クリップ

投稿2019/10/01 13:27

CakePHPにてサイト製作中です。特定の投稿記事に対し、コメントを表示させる際の、データを表示させる際の記述方法がわからず、困っています。

▽環境▽
AWS Cloud9:無料枠
MySQL:ver5.7.26
CakePHP:ver3.8.2
PHP:ver7.2.19

src/Template/Ices/ranking.ctp

<?php <?php foreach ($ices as $ice): ?> <?= h($ice->ice_name) ?><br>  //一部省略// <?php if ($ice->comments): ?> <p><?= h($ice->comments[0]->comment) ?></p> <p>BY<?= $this->Html->link( h($ice->comments[0]->user->nickname), ['controller' => 'Users', 'action' => 'view', $ice->comments[0]->user['id']]) ?></p> <?php else: ?> <p>コメントはまだありません。</p> <?php endif ?> <?php endforeach; ?> //一部省略//

■解決したいこと■
現在、上記ファイル内の、

<p><?= h($ice->comments[0]->comment) ?></p> のように[0]を指定すると、それに該当する「1」レコード分のcommentデータは表示できるのですが、[0]をはずし、 <p><?= h($ice->comments->comment) ?></p> と記述すると、 Trying to get property 'comment' of non-object とエラーが表示されてしまいます。 最終的に、1記事に関連するcommentデータを全件、 または特定件数分表示できるようにしたいと考えていますが、 具体的にどのように記述すればよいか、 ご教示いただきたいです。 質問内容に不備があれば、追記いたしますので、 アドバイスをどうぞよろしくお願いいたします。 ※あわせて、ctp側でのデータを表示させるための様々な記述方法について、 公式ドキュメントを追っていますが、まとまった表記が確認できない状況です。 わかる範囲で結構なのですが、ctp側でのデータ表示をする際に記述をまとめた 参考サイト等、あればあわせて伺いたいです。

▽以下、現在のModel、関連するControllerです。

CommentsTable

1  //一部省略 2class CommentsTable extends Table 3{ 4 public function initialize(array $config) { 5 parent::initialize($config); 6  //一部省略 7 8   $this->belongsTo('Ices', [ 9 'foreignKey' => 'ice_id', 10 'joinType' => 'INNER' 11 ]); 12 13 $this->belongsTo('Users', [ 14 'joinType' => 'INNER' 15 ]); 16 }

IcesTable

1<?php 2  //一部省略 3class IcesTable extends Table 4{ 5 public function initialize(array $config) 6 { 7 parent::initialize($config); 8  //一部省略 9 10 $this->belongsTo('Users', [ 11 'foreignKey' => 'user_id', 12 'joinType' => 'INNER' 13 ]); 14 $this->hasMany('Comments', [ 15 'foreignKey' => 'ice_id' 16 ]); 17 }

IcesController

1<?php 2namespace App\Controller; 3use App\Controller\AppController; 4class IcesController extends AppController 5{ 6 public function initialize() 7 { 8 parent::initialize(); 9 $this->Auth->allow(['index','view','search']); 10 $this->loadModel('Comments'); 11 $this->loadModel('Users'); 12 } 13 14 public function search() 15 { 16 $ices = $this->Ices->find('all'); 17 $manufacturer = isset($this->request->query['manufacturer']) ? $this->request->query['manufacturer'] : null; 18 $keyword = isset($this->request->query['keyword']) ? $this->request->query['keyword'] : null; 19 20 if($manufacturer){ 21 $where = ['Ices.manufacturer' => $manufacturer]; 22 23 if ($keyword) { 24 $where['OR']['Ices.ice_fraver LIKE'] = "%$keyword%"; 25 $where['OR']['Ices.simple_comment LIKE'] = "%$keyword%"; 26 } 27 28 $ices = $this->Ices->find('all'); 29 $ices->where($where) 30 31 ->contain(['Comments.Users','Users']) 32 ->all(); 33      //↑ここでドット記法でcontainし、ranking.ctpへ渡す 34 $this->set('manufacturer', $manufacturer); 35 $this->set('keyword', $keyword); 36 37 $this->set('ices', $this->paginate($ices)); 38 $this->render('ranking'); 39 } 40 } 41} 42

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

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

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

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

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

guest

回答1

0

ベストアンサー

$ice->comments は配列となっていますので、全て表示したいのであれば繰り返し構文 foreach または for を使用します。

PHP: foreach - Manual
PHP: for - Manual

全件表示したいのであれば、foreachを使用し、

php

1// 略 2<?php if ($ice->comments): ?> 3<?php foreach ($ice->comments as $comment) : ?> 4<p><?= h($comment->comment) ?></p> 5<p>BY<?= $this->Html->link( 6 h($comment->user->nickname), 7 ['controller' => 'Users', 'action' => 'view', $comment->user['id']]) ?></p> 8<?php endforeach; ?> 9<?php else: ?> 10// 略

とします。

繰り返し構文はプログラミングの基本の構文ですので、必ず習得しましょう。

投稿2019/10/02 03:27

nojimage

総合スコア957

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

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

Ryota.I

2019/10/02 13:09

nojimage様 いただきました回答を元に実行したところ、希望の挙動を得ることができました。 教えていただいたPHPの公式ドキュメントもしっかり熟読し、自分のものにしていきます。 また、つまづく点があった際には質問させていただくと思いますので、その際にはよろしくお願いします。丁寧な記述はとても助かりました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問