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に設定するのも良いかと思います。