For Want Of A Better Word

【Cake】paginateでhavingしたときのエラー… とその対応 paginateCount()のカスタム

   

cakeでsumとかavgとか集計関数を使う場合、

find()やpaginate()の取得項目指定オプションでそのままsum(xx)とかしてあげればよい。

group byはarray(group =>… )

下記のような感じ。あくまでpaginateの例

でさらに sum(value)>0とか条件をつけようとすると HAVINGを利用することになる。

cakeの場合HAVINGを入れる場所がないらしく、

無理やりgroupの後ろに足してしまう。

 

で、こうしたときにだ。

pagenateにおいてエラーが起きる。(たぶんfindは大丈夫….)

データを取るクエリは正常なのだけれど、その後に発行される件数を取得するためのクエリーでエラーとなる。

HAVINGをgroup句に追加していない場合は、下記のSQLが発行され問題ないのだが、

 

これが groupに HAVINGを記述していると

 

と最後にHAVING以下がついてしまい、sum(value)項目がないよというエラーになる。

 

paginateでHavingはあきらめないと行けない感じ???

 

調べると、この件数のカウントはpagenateCount()というメソッドをモデルに定義することで、任意の処理に変更できるらしい。

今の問題は件数のカウントについて、集合関数 + HAVINGのクエリーに対してfieldが”count(*)”となっていることが問題。

さらにSQLで件数を取ろうとすると、HAVINGを含むクエリを吹く問い合わせにする必要があるので、なお面倒。

実行結果にphpのcount()をかけられれば、それはそれでよい。

(2回SQL発行で遅くなるけど….)

コントローラーはこういう状態で

modelに下記を追加する。

 

paginateCount()で同条件でもう一度findして、そのcountを返すと。

paginateCount()がオーバーライドされてハッピー

これでエラーは解消した。

しかし、2回発行は何とかしたいし、もっと任意のSQLを投げる手もあるよう。

すばらすい。

http://www.marineroad.com/staff-blog/4383.html

http://qiita.com/satthi/items/216f951d48187499abe7

 - cake

  関連記事

【Cake】設定・appを公開領域外に配置

cakeの設定類、アプリを公開領域外に配置したい。 大事な情報は公開領域におきた …

symfony2しんどい

面倒くさい。。。。。 多機能だからか。Cakeに慣れているからか。しんどい。。。

【Cake】絞り込み検索結果にもページネーションやソートを使いたい

CakePHPではbake一覧画面を作ると、ページネーションやテーブルヘッダーで …

【Cake】【PHP】Cakeのリクエストデータ取得の時存在チェックが面倒くさい

CakePHP – 【cake】&#x3 …

未解決・疑問 CakePHPファイルアップロードのサイズチェックについて

CakePHPでファイルのアップロードを受け付けようとしてて、ちょっと嵌っている …