1

以下のクエリを Cakephp ページネーションで使用することは可能ですか??

select u.email,(select count(*) from relatives as iu where iu.user_id=u.id ) as iu_count,(select count(*) from friends as ff where ff.user_id=u.id ) as ff_count from users as u having (iu_count>0 OR ff_count>0)

Cakephp のページネーションを使用してこれを実行しようとしましたが、「iu_count」と「ff_count」はクエリの選択部分では使用できませんが、Having 句では使用できるため、エラーが発生します。私のcakephpページネーションクエリは以下の通りです。

SELECT COUNT(*) AS `count` FROM `abc`.`users` AS `User` WHERE 1 GROUP BY `User`.`id` having (iu_count>0 OR ff_count>0) 

これを扱うにはヘルプ/ガイダンスが必要です。

4

1 に答える 1

1

今日、私はさらにグーグルで検索し、自分に合った解決策を見つけました。解決策は、モデルの paginateCount メソッドをオーバーライドすることです。

以下はオーバーライドされた関数です。

public function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
        $parameters = compact('conditions', 'recursive');

        if (isset($extra['group'])) {
            $parameters['fields'] = array("iu_count","ff_count");
            //$parameters['fields'] = $extra['group'];
            if (is_string($parameters['fields'])) {
                // pagination with single GROUP BY field
                if (substr($parameters['fields'], 0, 9) != 'DISTINCT ') {
                    $parameters['fields'] = 'DISTINCT ' . $parameters['fields'];
                }
                unset($extra['group']);
                $count = $this->find('count', array_merge($parameters, $extra));
            } else {
                // resort to inefficient method for multiple GROUP BY fields
                $count = $this->find('count', array_merge($parameters, $extra));
                $count = $this->getAffectedRows();
            }
        } else {
            // regular pagination
            $count = $this->find('count', array_merge($parameters, $extra));
        }
        return $count;
    }

ここでは「array("iu_count","ff_count");」HAVING句で使用している仮想フィールドです。HAVING 句に必要な仮想フィールドがない場合は、$extra['group'] を $parameter['fields'] に割り当てます。

このソリューションが誰かに役立つことを願っています。

于 2013-08-05T07:48:44.173 に答える