LoginSignup
6

More than 5 years have passed since last update.

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

Posted at

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
  3. You can use dark theme
What you can do with signing up
6