これについては昨年、記事を書きました。最初の部分である第 1 レベルの関連付けでソートする方法については回答がありましたが (ありがとうございます!)、第 2 レベルの関連付けでソートする方法についての質問の 2 番目の部分については回答がありませんでした。それは大きな問題ではなく、時間がなくなったので、実際に実装することはありませんでした。しかし今、私たちは Web を更新しており、クライアントはこの機能、つまり次のモデルを必要としています。
- 会社所属市区町村
- 都市は国に属し、多くの企業を持っています
- 国には多くの都市があります
[会社] ページで、City.Country.name で並べ替えます。recursive=2 を入れても動きません。Cake は私の「注文」条件を無視します。生成された SQL には、「順序付け」がまったくありません。
ただし、City.name でソートすると問題なく動作します。
これを行う方法はありますか?ドキュメントと Stackoverflow を精査してきました。仮想フィールド、カスタム クエリを見てきました。
有望に見える 1 つの方法は、CompanysController で Model->query() を使用することでした。
$companies = $this->Company->query("SELECT * FROM companies com left join city c on c.id = com.city_id left join countries c2 on c2.id = c.country_id order by c2.name");
しかし、これが最善/唯一の方法ですか?そして、ページネーションのオーバーライドについて心配する必要はありませんか? 私はそれを気にしませんが、会社のために「通常の」組み込みのページネーションを他の場所で使用したいと思います。それは可能でしょうか?
また、ドキュメントの例では、 Model->query('SELECT * FROM pictures AS Picture LIMIT 2') のようなことを行うように指示されているため、結果の配列はモデル名を配列キーとして使用します。しかし、複雑なクエリでこれを行うにはどうすればよいでしょうか? 「AS」はどこに行きますか?
私はむしろ、このようなことを避けることができることを望んでいました. それを行う簡単な方法はありますか?
編集
こんにちは、助けてくれてありがとう。「ページネーション技術」とは、Cake に組み込まれているページネーションのことですか? はい、それが私が欲しいものです。コントローラーのデフォルトのページング条件は次のとおりです。
$this->paginate = array('conditions' => 'order' => array('Company.name' => 'ASC');
そして、それは会社名でソートされます。SQLは
SELECT Company.id, etc. FROM companies AS Company LEFT JOIN cities AS City ON Company.city_id = City.id order by Company.name
そして、このようにビューにページングリンクを作成すると
$paginator->sort('City.name')
これらのパラメータをURLに追加します
.../companys/sort:City.name/direction:desc
都市名でソートします。SQLは
SELECT Company.id, etc. FROM companies AS Company LEFT JOIN cities AS City ON Company.city_id = City.id order by City.name
しかし、私がこれを試すと:
$paginator->sort('City.Country.name');
これらのパラメータをURLに追加します
.../companies/sort:City.Country.name/direction:asc
生成されたSQLは
SELECT Company.id, etc. FROM companies LEFT JOIN cities AS City ON (Company.city_id = City.id)
「並べ替え」条件を完全に無視し、「並べ替え」はまったくありません。理由はわかりません。たぶんケーキはこれを行うことができませんか?「再帰」を2に設定しています。
もう 1 つのオプションは Model->query です。これは試してみて動作しましたが、paginate メソッドと paginateCount メソッドをオーバーライドする必要があるため、使用したくありません。これはそれほど難しくありませんが、問題は同じページにあることです。 、および他のページでは、企業向けの「通常の」 Cake ページングを既に使用しています。したがって、paginate と paginateCount をオーバーライドした場合、オーバーライドされた新しいページングを使用するために、これらすべてのページを変更する必要はありませんか? それはやり過ぎのように思え、この1つのケースを除いて他のどこでもうまく機能しているので、私はそれを避けたいです.
どんな支援も大歓迎です。
ボブ