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

  関連記事

cakephp_logo
Cake SQL確認

よく忘れるのでメモメモ。default.ctpに書いているけど、すぐ消しちゃうし …

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

CakePHP – 【cake】&#x3 …

cakephp_logo
Cakeでログインして、その情報をCake以外のPHPから参照したい。(セッションの共有)

なんてことは無かった。 cakeでAuthコンポーネント使ってログインして、それ …

cakephp_logo
【Cake】一般用テーブルと、管理用テーブルを分ける場合のログイン(Auth)の使い方・整理

まず1つサービス・ログイン機能 これは ①Userテーブル、UserModel、 …

java-logo
javaのFilter(フィルター)

http://www.javaroad.jp/servletjsp/sj_ser …