積み重ねた日々 このページをアンテナに追加 RSSフィード

2009-02-28

[]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());

って感じで指定しちゃうのが正しいのかな。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/solitary_shell/20090228/1235816868