CakePHP4: Joinしたテーブルでsumやcount関数を使い、PaginatorHelperでカラムのsortをさせたいのに動かない

まじで情報なさすぎやろ!(ブチギレ

やりたいこと

以下、3つのテーブルがあったとします。

  • articles(記事)テーブル
  • authors(投稿者)テーブル
  • page_views(記事閲覧数)テーブル

これら3つをjoinし、かつ、page_viewsテーブルのpvカラムをsumして取得したい。

(1)containできない

なんか、sumを使うと2つ以上のテーブルをcontainでjoinしてくれなくなるらしい。
何やねんそれ。

脳死でjoinした。

$query = $this->Articles->query()
            ->contain([
                'Authors',
            ])
            ->join([
                'PageViews' => [
                    'table' => 'page_views',
                    'type' => 'LEFT OUTER',
                    'conditions' => [
                        'Articles.id = PageViews.article_id',
                    ],
                ],
            ])
            ->group('Articles.id')
        ;

        $query = $query->select([
            'id' => 'Articles.id',
            'title' => 'Articles.title',
            'created_at' => 'Articles.created_at',
            'author_id' => 'Articles.author_id',
            'author_name' => 'Authors.name',
            'pv' => $query->func()->sum('PageViews.pv'),
        ]);
        
        $this->paginate($query);

(2)ページネーションのソートが効かない

<?= $this->Paginator->sort('title', 'タイトル', ['class' => 'link']); ?>

のようにすれば、文字がリンク化されて自動的にorderByしてくれる。。。
はずなのに!!!
してくれない!!!

答え。
$paginate変数にsortableFieldsを定義して突っ込む。

    public $paginate = [
        'order' => ['modified' => 'desc'],
        'limit' => 30,
        'sortableFields' => [    // これ!!!!!!!!!!!!
            'id',
            'title',
            'created_at',
            'author_id',
            'author_name',
            'pv',
        ],
    ];

いやー……Cake、嫌いになるわー

参考

[PR] おすすめの本
この記事を書いた人
Nな人(えぬなひと)。
Nは本名から取っています。
Laravelが大好きなPHPerで、WEBを作るときはLaravelを技術スタックに絶対推すマン。
PHP、Pythonと、昔はperlを書いていたP言語エンジニア。
最近はNimを書いたりしています。