CakePHP3 他テーブルの特定レコードを紐付け抽出ができない
お世話になります。CakePHP3で投稿サイトを制作中です。あるキーワードを元に検索した内容をrankingページに表示させようと考えています。その表示させた記事に対し、他ユーザーのコメントした内容とあわせ、コメント投稿者のニックネームも表示させたいと考えていますが、ニックネームの情報取得ができず、困っています。
▽環境▽
AWS Cloud9:無料枠
MySQL:ver5.7.26
CakePHP:ver3.8.2
PHP:ver7.2.19
▽現在のMySQLのテーブル構造です▽
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)
▽/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://book.cakephp.org/3.0/ja/orm/associations.html
https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html#eager-loading-associations
↑の内容は確認しましたが、要望に対しての記述方法について、
現在記載済みのコードのどこをどう変更すればよいか、わからない状況が続いています。
現在の状態から、どう記述を変更していけばよいか。
ご教示をお願いいたします。