LoginSignup
6

More than 5 years have passed since last update.

posted at

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6