月別アーカイブ: 2011年6月

[cakephp] find(‘count’)について

何も考えずに、

        $params =
            array(
                "conditions" =>  $conditions,   // 検索条件
                'fields' => array('User.id')
            );
        $count = $this->User->find("count", $params);

とやって、$countが帰ってこないなあと思ったら。
fieldsを指定していると、countが実行されないらしい。
参考:http://d.hatena.ne.jp/solitary_shell/20090228/1235816868

        $params =
            array(
                "conditions" =>  $conditions,   // 検索条件
                'fields' => array()
            );
        $count = $this->User->find("count", $params);

として、対応。

[cakephp]他のコントローラーへPOSTすると何も表示されない

他のコントローラーの処理へPOSTで遷移しようとすると、何も表示されないままおわってしまうという現象に遭遇。
Securityコンポーネントを使用していたため発生していた。
そんなにセキュリティに気を使わなくてもよい画面だったので、Securityコンポーネントをはずして対処。

[cakephp] group by を使っていると paginateが返す値がおかしい。

group byを使用して、paginateを使うと、帰ってくる値がおかしい。
結局、以下のように自分で計算・取得しなおして、対処した。

        $params =
            array(
                "conditions" => array('Test.keyword' => $keyword),   // 検索条件
                'fields' => array('Test.id'),
                'group'=>'Test.id',
                'order'=>'Test.created'
            );

        $this->Test->recursive = 0;

        $this->paginate = array_merge($params, array("limit" => $limit));
        $results = $this->paginate();

        // paginateが返す件数とページ数などがおかしいので修正する
        $sql = 'SELECT id
                FROM tests Test'
;
        $sql .= " WHERE keyword='".$keyword."' ";
        $sql .= " GROUP BY id ";
        $results_count = $this->Test->query($sql, false);

        $this->params['paging']['Test']["current"] = isset($this->params["named"]["page"]) ? $this->params["named"]["page"] : 1;
        $this->params['paging']['Test']["page"] = isset($this->params["named"]["page"]) ? $this->params["named"]["page"] : 1;
        $this->params['paging']['Test']["count"] = count($results_count);
        $this->params['paging']['Test']["pageCount"] = intval(ceil(count($results_count) / $limit));
        $this->params['paging']['Test']["prevPage"] = ($this->params['paging']['Test']["page"] > 1);
        $this->params['paging']['Test']["nextPage"] = ($this->params['paging']['Test']["count"] > ($this->params['paging']['Test']["page"] * $limit));

        // paginateが返すレコードがおかしいので修正する
        $limit_from = ($this->params['paging']['Test']["current"]-1) * $limit;

        $sql = 'SELECT id
                FROM tests Test'
;
        $sql .= " WHERE keyword='".$keyword."' ";
        $sql .= " GROUP BY id ";
        $sql .= " LIMIT  ".$limit_from.",".$limit;
        $results = $this->Test->query($sql, false);

[cakephp]input(“id”)はhiddenになる

最近は、cakephpの仕事をしています。
個人的メモ。

echo $form->input(‘id’);

と記述すると、

のようなタグが出力される。
idは、キーとして使用される事が多いので、cakeが自動的に判断して、hiddenにしているようだ。
親切なんだけど、しばらく悩んだ。