🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
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回答

1225閲覧

CakePHP3 特定フィールドを関連付けして取得ができない

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/09/26 13:02

編集2019/09/28 01:32

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

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

▽MySQL▽
テーブルはUsers、Comments、Icesの3つに分かれています。

show create table users \G *************************** 1. row *************************** Table: users Create Table: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, ~一部省略~ `nickname` varchar(30) NOT 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_fraver` varchar(50) NOT NULL, `simple_comment` varchar(20) NOT 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) 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, ~一部省略~ 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)

▽CakePHPのModel▽

/src/Model/Table/UsersTable.php public function initialize(array $config) { parent::initialize($config); $this->setTable('users'); $this->setDisplayField('id'); $this->setPrimaryKey('id'); $this->addBehavior('Timestamp'); $this->hasMany('Comments',[ 'foreignKey' => 'user_id' ]); $this->hasMany('Ices', [ 'foreignKey' => 'user_id' ]); $this->hasMany('Comments', [ 'foreignKey' => 'user_id' ]); /src/Model/Table/IcesTable.php public function initialize(array $config) { parent::initialize($config); $this->setTable('ices'); $this->setDisplayField('id'); $this->setPrimaryKey('id'); ~一部省略~ $this->belongsTo('Users', [ 'foreignKey' => 'user_id', 'joinType' => 'INNER' ]); $this->hasMany('Comments', [ 'foreignKey' => 'ice_id' ]); /src/Model/Table/CommentsTable.php public function initialize(array $config) { parent::initialize($config); $this->setTable('comments'); $this->setDisplayField('comment'); $this->setPrimaryKey('id'); $this->belongsTo('Ices', [ 'foreignKey' => 'ice_id', 'joinType' => 'INNER' ]); $this->belongsTo('Users', [ 'foreignKey' => 'id', 'joinType' => 'INNER' ]); }

/src/Controller/IcesController.php

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'); } }

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

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

一旦、当サイトの関連記事として、
https://teratail.com/questions/42581
を参照し試してみたものの、未だ解決できていません。

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

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

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

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

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

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

guest

回答1

0

自己解決

/src/Model/Table/CommentsTable.php

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

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

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

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

投稿2019/09/29 10:57

Ryota.I

総合スコア22

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問