cakePHPはベイクで自動生成したControllerファイルとViewファイルには、標準でデータを取得し一覧表示する機能が既に準備される便利なものです。並び順はIDの昇順となっていて、古い順から頭になる。
お知らせやトピックス、ニュースなどの機能にする時は、新しいもの順にしたいはず。IDもしくは登録日、変更日を降順とすれば新着順としてデータを取得したいもの。
Viewのindex.ctpは後にソートするためのHtmlヘルパーも自動で挿入してくれているけど、Controllerで最初に取得する命令文の設定次第では、ソートが効かない場合がある。それは、getでパラメーター値を取得して取得する順番を支持するしても、Controllerで設定してしまうとそちらが優先となる様子。
indexのアクションをしたときに、降順で以下のように設定を変更してみました。
public function index() {
$topics = $this->paginate($this->Topics);
// ↓以下に変更
$topics = $this->paginate($this->Topics->find()->order(["id" => "desc"]));
$this->set(compact('topics'));
}
しかし、sortでパラメータ送っても他基準による降順の動きにはなりませんでした。どうやらアクションでデータを取得するfindに降順設定をしているのが優先となる様子。
調べると、findではなく、paginate側の設定で降順を指定するとパラメータは生きるらしいので、以下の内容で設定終了。
index前にpagenateの設定を追加
public $paginate = [
'limit' => 10,
'order' => [
'id' => 'desc'
]
];
もし他のアクションにも適応したい場合にはbeforefilterで設定しても良いし、ほかのコントローラにも適応したいのであれば継承元のAppControllerに設定するのも良いかと思います。