CakePHPのPaginate便利ですよね。特に設定しなくても、ソートもページングもできる。素晴らしい。ただ、joinしているモデルのカラムをキーにソートしようとすると効かないという…。どうしよう。

答え→バーチャルフィールドを設定する

解決方法は簡単で、ソートしたいカラムをバーチャルフィールドとして登録するだけです。

model.php

<?php
class Hoge extends AppModel {
	var $virtualFields = array(
		hoge => JoinTable.hoge
	);

view.ctp

<?php echo $this->Hoge->sort(hoge,ソートキー); ?>

ただし、ソートのためだけにバーチャルフィールドを設定するとfindした時にうざったいことになる可能性があるので、必要な時だけに設定するのが吉。

ちなみに、なぜjoinしているモデルではソートできないのかというと、URLに適当なキーを直接入力してエラーになるのを防ぐためらしい。