
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