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

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

ただいまの
回答率

87.36%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,431

score 22

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です。

  //一部省略       
class CommentsTable extends Table
{
     public function initialize(array $config)    {
        parent::initialize($config);
  //一部省略       

       $this->belongsTo('Ices', [
            'foreignKey' => 'ice_id',
            'joinType' => 'INNER'
        ]);

        $this->belongsTo('Users', [
              'joinType' => 'INNER'
        ]);
    }
<?php
  //一部省略       
class IcesTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);
  //一部省略       

        $this->belongsTo('Users', [
            'foreignKey' => 'user_id',
            'joinType' => 'INNER'
        ]);
        $this->hasMany('Comments', [
           'foreignKey' => 'ice_id'
        ]);
    }
<?php
namespace App\Controller;
use App\Controller\AppController;
class IcesController extends AppController
{
    public function initialize()
    {
    parent::initialize();
    $this->Auth->allow(['index','view','search']);
    $this->loadModel('Comments');
    $this->loadModel('Users');
    }

    public function search()
    {
        $ices = $this->Ices->find('all');
        $manufacturer = isset($this->request->query['manufacturer']) ? $this->request->query['manufacturer'] : null;
        $keyword = isset($this->request->query['keyword']) ? $this->request->query['keyword'] : null;

        if($manufacturer){
            $where = ['Ices.manufacturer' => $manufacturer];

            if ($keyword) {
            $where['OR']['Ices.ice_fraver LIKE'] = "%$keyword%";
            $where['OR']['Ices.simple_comment LIKE'] = "%$keyword%";
            }

            $ices = $this->Ices->find('all');
            $ices->where($where)

            ->contain(['Comments.Users','Users'])
            ->all();
      //↑ここでドット記法でcontainし、ranking.ctpへ渡す
            $this->set('manufacturer', $manufacturer);
            $this->set('keyword', $keyword);

            $this->set('ices', $this->paginate($ices));
            $this->render('ranking');
    } 
    }  
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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

PHP: foreach - Manual
PHP: for - Manual

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

// 略
<?php if ($ice->comments): ?>
<?php foreach ($ice->comments as $comment) : ?>
<p><?= h($comment->comment) ?></p>
<p>BY<?= $this->Html->link(
     h($comment->user->nickname),
     ['controller' => 'Users', 'action' => 'view', $comment->user['id']]) ?></p>
<?php endforeach; ?>
<?php else: ?>
// 略

とします。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/02 22:09

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

    キャンセル

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

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る