もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

cakephp3のpaginateでsubqueryを使う

こんにちは。

簡単なのですが、忘れないようにメモ。

CREATE TABLE `tag_masters` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL COMMENT 'タグ名',
  `created` timestamp NOT NULL COMMENT '登録日',
  `modified` timestamp NOT NULL COMMENT '更新日', 
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `tag_relations` (
  `tag_id` int(11) unsigned NOT NULL COMMENT 'タグID',
  `item_id` int(11) unsigned NOT NULL COMMENT 'アイテムID',
  `created` timestamp NOT NULL  COMMENT '登録日',
  PRIMARY KEY (`tag_id`,`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

こんな感じのタグテーブルがあったとして、cakephpのpaginateでデータを取ってきたい時に、各タグの紐づけ数を一緒に取るときはこんな感じになるようです。

<?php
$this->paginate = [
        'fields' => [
            'TagMaster.id',
            'TagMaster.name',
            'TagMaster.created',
            'TagMaster.modified',
            'TagMaster__count' => "(SELECT count(l.tag_id) FROM tag_relations AS l WHERE TagMaster.id = l.tag_id)"
        ]
];

cakephpがDBにSQLを発行する際、各カラムをEntity名__カラム名で別名を貼って発行するので、その命名に沿って指定すれば取れるってことでした。

良かった。解決。