Cakephp PHP WEB開発

【Cakephp4】Paginator: 関連モデルのカラムをソートする方法

※本サイトはPR表記を含みます。

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プロパティに明記する必要があります。

-Cakephp, PHP, WEB開発
-