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もオッケー。