

お世話になります。CakePHP3で投稿サイトを制作中です。あるキーワードを元に検索した内容をrankingページに表示させようと考えています。その表示させた記事に対し、他ユーザーのコメントした内容とあわせ、コメント投稿者のニックネームも表示させたいと考えていますが、ニックネームの情報取得ができず、困っています。

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

▽現在のMySQLのテーブル構造です▽

[code]

    mysql> show create table users\G
    *************************** 1. row ***************************
           Table: users
    Create Table: CREATE TABLE `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `email` varchar(255) NOT NULL,
      `password` varchar(255) NOT NULL,
      `nickname` varchar(30) NOT NULL,
      `profiel_comment` varchar(100) NOT NULL,
      `created` datetime DEFAULT NULL,
      `modified` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)    mysql> show create table ices \G
    
    *************************** 1. row ***************************
           Table: ices
    Create Table: CREATE TABLE `ices` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL,
      `manufacturer` varchar(50) NOT NULL,
      `ice_name` varchar(50) NOT NULL,
      `ice_fraver` varchar(50) NOT NULL,
      `price_no_tax` int(5) unsigned NOT NULL,
      `buy_year` int(4) unsigned NOT NULL,
      `buy_month` int(2) unsigned NOT NULL,
      `image_file` varchar(255) DEFAULT NULL,
      `created` datetime DEFAULT NULL,
      `modified` datetime DEFAULT NULL,
      `simple_comment` varchar(20) NOT NULL,
      `desc_comment` varchar(100) NOT NULL,
      `repeat_rate` int(11) DEFAULT NULL,
      `stock_rate` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `ice_fk` (`user_id`),
      CONSTRAINT `ice_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)
    
    mysql> show create table comments \G
    *************************** 1. row ***************************
           Table: comments
    Create Table: CREATE TABLE `comments` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `ice_id` int(11) NOT NULL,
      `user_id` int(11) NOT NULL,
      `comment` varchar(100) NOT NULL,
      `repeat_rate` int(11) DEFAULT NULL,
      `stock_rate` int(11) DEFAULT NULL,
      `created` datetime DEFAULT NULL,
      `modified` datetime DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `comments_fk` (`user_id`),
      KEY `comments_ices_fk` (`ice_id`),
      CONSTRAINT `comments_fk` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `comments_ices_fk` FOREIGN KEY (`ice_id`) REFERENCES `ices` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)
    
[/code]

▽/src/Controller/IcesController.php▽

[code]

    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->where($where)
                ->contain(['Users','Comments'])
                ->all();
                $this->set('manufacturer', $manufacturer);
                $this->set('keyword', $keyword);
                $this->set('ices', $ices);
                $this->render('ranking');
        }
        }
    
[/code]

上記の内容で現在、記述しています。

Icesテーブルの、manufacturer、もしくはmanufacturerとice_fraver、manufacturerとsimple_commentのいずれかの組み合わせで検索をし、  
rankingに該当するIcesテーブルの情報+紐づくCommentsテーブルの情報、  
さらにそのコメントをしたComementsテーブルのuser_idにひもづくUsersテーブルのnicknameの取得が目的です。

既にアソシエーション関連の記述の変更が必要と思い、  
[https://book.cakephp.org/3.0/ja/orm/associations.htm](https://book.cakephp.org/3.0/ja/orm/associations.html)l  
<https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-
resultsets.html#eager-loading-associations>  
↑の内容は確認しましたが、要望に対しての記述方法について、  
現在記載済みのコードのどこをどう変更すればよいか、わからない状況が続いています。

現在の状態から、どう記述を変更していけばよいか。  
ご教示をお願いいたします。


CC BY-SA 4.0
2019-09-28T02:07:52.423
59329
2019-09-29T11:02:23.207
36000
question
php mysql cakephp
CakePHP3 他テーブルの特定レコードを紐付け抽出ができない


自己解決できました。

/src/Model/Table/CommentsTable.php

[code]

    $this->belongsTo('Users', [
                //'foreignKey' => 'id',//☆1
                'joinType' => 'INNER'
            ]);
    
[/code]

☆1の部分を消し、  
/my_pt_lesson/src/Template/Ices/ranking.ctpに

[code]

    <p>BY<?= $this->Html->link( h($ice->comments[0]->user->nickname),
    ['controller' => 'Users', 'action' => 'view', 
    $ice->comments[0]->user['id']]) ?></p>
    
[/code]

...のように記述し、コメントに紐づくユーザー名の取得ができました  
回答はいただけませんでしたが、一度でもご覧いただいた皆様、  
お騒がせいたしました。


CC BY-SA 4.0
2019-09-29T11:02:23.207
59341
2019-09-29T11:02:23.207
36000
59329
answer