質問: ### 前提・実現したいこと CakePHPでfindで検索する際にリレーション先のモデルのcount数でorderをしたいです。 Containableビヘイビアのcontainでリレーション先のモデルを絞り込むことまでは出来ました。 しかし、その先のリレーション先のモデルのcount数を取得、そのcount数でorderするまでの方法が分かりません。 実装できる方がいましたら、教えていただけると幸いです。 ### 該当のソースコード ``` $this->Tag->find('all', array( 'contain' => array( 'SearchWord' => array( 'conditions' => array( 'del_flg' => false ) ), ), 'order' => 'ここで絞り込んだSearchWordのcount数でソートさせたい' )); ``` ### 補足情報(言語/FW/ツール等のバージョンなど) TagとSearchWordは、TagがSearchWordを複数持つhasManyの関係です
回答: hasManyの関係だと一つのfindでも実際に実行されるSQLはTagとSearchWordで別々です。なのでTagのorderはTagのカラムでしか無理です。 自分がよくやる回避策は、SearchWordをTagでgroup byしてcountを取ったViewをデータベースに作っておいて、このViewとhasOneの関係でアソシエーションする方法です。hasOneやbelongsToはTagと同じSQLで取得するのでorder指定できます。 あとは、PHP側でSQLの後で、ソートする方法とかですかね(ただし、ページネートで使うソートの場合SQLでやらないと意味が無いので使えませんが)