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
を参照し試してみたものの、未だ解決できていません。
現在の状態から、どう記述を変更していけばよいか。
ご教示をお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。