CakePHP
MySQL

CakePHP、MySQLのビューテーブルでbakeしてみる

More than 3 years have passed since last update.

SNSみたいので発言があってそのコメントがある。

で、画面には発言の一覧があって、その発言についたコメントの数があって、このコメント数で並び替えたい!

とかいう場合にどうするか、って話なんだけどさ。

昨日そういう話になって、おれは発言テーブルにカウント数のフィールドを作っておいてそれをコメントがつく度にプラスする、と言ったらそりゃ最低だ、せめてビューテーブル使ってくれ、と言われたので、ちょっと実験してみた。

発言テーブルは以下のようなもの。parent_id=0の時は親発言。コメントは常に親発言に対してのみ。ツリー状にならない。

mysql> desc posts;

+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| subject | text | YES | | NULL | |
| comment | text | YES | | NULL | |
| post_date | datetime | YES | | NULL | |
| parent_id | int(11) | YES | | NULL | |
| created | datetime | YES | | NULL | |
+------------+--------------+------+-----+---------+----------------+

ビューテーブルを作ってみる。

CREATE VIEW counted_posts AS

SELECT p.id, p.parent_id,
(SELECT COUNT(c.id) FROM posts AS c WHERE c.parent_id=p.id) AS rc
FROM posts AS p
WHERE p.parent_id=0

CakePHPをインストール。なんかもうデフォルトが3になっちゃったみたい。

sudo php composer.phar create-project --prefer-dist cakephp/app myapp

sudo chown -R mymac:staff myapp/
cd myapp/

サーバー起動して動作確認。

bin/cake server

OKだったらモデルとコントローラを自動生成。

bin/cake bake model CountedPosts

bin/cake bake controller CountedPosts

テンプレートも。。。と行きたかったが、

bin/cake bake template CountedPosts

以下のように主キーがないってエラーになる。

Welcome to CakePHP v3.0.2 Console

---------------------------------------------------------------
App : src
Path: /Users/mymac/Sites/myapp/src/
---------------------------------------------------------------
Error: Cannot generate views for models with no primary key

モデルのテーブルのイニシャライズのところに、

$this->primaryKey('id');

を追記。

class CountedPostsTable extends Table

{

/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/

public function initialize(array $config)
{
$this->table('counted_posts');
$this->primaryKey('id');
$this->('ParentCountedPosts', [
'className' => 'CountedPosts',
'foreignKey' => 'parent_id'
]);
$this->hasMany('ChildCountedPosts', [
'className' => 'CountedPosts',
'foreignKey' => 'parent_id'
]);
}

勝手に作られてるbelongsToのparentとかchildとかが不気味だが、

再びテンプレートをbakeして終了。もちろん、paginateもオッケー。