Cakephp4にてPaginatorヘルパーの sort()
機能に関連モデルのソートを行う場合、対象テンプレートファイル内に $this->Paginator->sort('関連モデル名.id')
などと実装してもソートしてくれません。
そのような場合、コントローラー内にて sortableFieldsキーを利用し、ソートしたいカラム「モデル名.カラム名」を定義していく必要があります。
ちなみに、Paginator::defaultModel()
の当該モデルのみの場合は、特にソート定義しなくても大丈夫です。
Cake4: 関連カラムのソートを有効にする
■コントローラークラス内、ページネート設定にて sortableFieldsキーを定義する
// クラスメソッド内に記述 $settings = [ 'sortableFields' => [ 'Hoges.id', 'Hoges.name', 'Fugas.type', 'Fugas.tel', 'created', ], ];
じつは Cake3 では sortWhitelist キーとして利用できていましたが、Cake4.1の時点で非推奨になったようです。
最新では上記の sortableFields を利用するようにしましょう。
Cake4: テンプレートでソートを利用例
<?= $this->Paginator->sort('Hoges.id', 'ID', ['direction' => 'desc']) ?> <?= $this->Paginator->sort('created', '開始日', ['direction' => 'desc']) ?>
sortableFields
を定義すると、当該モデルも初期化されるので注意が必要です。
なので、created
など、デフォルトで有効になっているソートも、sortableFields
プロパティに明記する必要があります。
■Cake4: Paginator の sortWhitelistは4.1で非推奨に
https://book.cakephp.org/4/ja/appendices/4-1-migration-guide.html#datasource
■Cake4: Paginator:使用例
https://book.cakephp.org/4/ja/views/helpers/paginator.html#id12