[CakePHP] モデルのquery()の結果を find()と同様の戻り値にする

  • このエントリーをはてなブックマークに追加

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));
  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。




コメントを残す