CakePHPでfind('count', array('fields' => array('f1', 'f2'));としてはいけない
CakePHP 1.2.1での話です。(CakePHP 1.1.xだと話は違います)
PersonというModelの全件を取得したい場合で、以下のような指定をすると件数でなくデータを取得してしまうみたい。
$this->Person->find('count', array('fields' => array('field1', 'field2'));
と指定した場合、パラメータの指定部分を無視して、
SELECT count(*) FROM people;
といったSQL文が実行されるのかなと思ってたら、違ってて
SELECT field1, field2 FROM people;
が実行されるみたい。
cake/libs/model/model.php内のメソッド_findCount(2010行目)を見てみると、
if (empty($query['fields'])) { $query['fields'] = $db->calculate($this, 'count'); } elseif (is_string($query['fields']) && !preg_match('/count/i', $query['fields'])) { $query['fields'] = $db->calculate($this, 'count', array( $db->expression($query['fields']), 'count' )); } $query['order'] = false; return $query;
となっていた。これじゃ、想定した通りにはならないハズだよなぁ。typeをcountって指定しているのだから無条件で変換してくれて欲しい。
と言いたいけど、やっぱり
$this->Person->find('count', array('fields' => array());
って感じで指定しちゃうのが正しいのかな。