PostgreSQLにおいてquery()の取得結果が期待した形になっていなかった件についてメモ。
CakePHP 1.2.5で確認。
まず普通に、
$this->Post->find('all');
とやると以下のような結果が得られます。
Array
(
[0] => Array
(
[Post] => Array
(
[id] => 1
[user_id] => 1
[comment] => hoge
)
)
[1] => Array
(
[Post] => Array
(
[id] => 2
[user_id] => 2
[comment] => fuga
)
)
)
PostgreSQLを使ってマニュアルどおりの結果を期待して、下記のクエリを実行してみました。
$this->Post->query('SELECT * FROM posts AS Post');
これでfind()と同じ結果が得られると思いきや結果はこうなりました。
Array
(
[0] => Array
(
[0] => Array
(
[id] => 1
[user_id] => 1
[comment] => hoge
)
)
[1] => Array
(
[0] => Array
(
[id] => 2
[user_id] => 2
[comment] => fuga
)
)
)
(´・ω・`)なんだか上手くいってません。ちょっち調べて見るとMySQLの場合はすんなりいくようですが、PostgreSQLではちょっと手間が掛かるようです。
モデルのqueryメソッドでfind、findAllと同等の返り値を得る方法 – Writing Some Code
カラム名にモデル名のほか、ダブルクォーテーションとアンダースコアを埋め込むとか。今回の例ではこのようにすれば良いようです。これって常識なの?
$this->Post->query('SELECT id AS "Post__id", user_id AS "Post__user_id", comment AS "Post__comment" FROM posts');
これはたまらん!いちいちカラム名を変えないといけないなんて、やってられませんなぁ。
ところでqueryメソッドってプレースホルダ使えたんですね。それでバインドできるとのこと。知りませんでした。
意外と知られていない? queryメソッドで値をbindできるってこと – cakephperの日記(cakePHP1.2ベース)
あまりつかわなそうだけどすこしは手間が省けるのかなぁ。
$sql = "SELECT `Post`.`id` FROM `posts` AS `Post` WHERE `Post`.`id` = ? LIMIT ?";
$this->Model->query($sql, array(100,1));
コメント