雑文発散

«前の日記(2012-02-12) 最新 次の日記(2012-03-10)» 編集
過去の日記

2012-02-29 [長年日記]

[CakePHP][PostgreSQL] CakePHP + PostgreSQL で Unix Timestamp を

Model::find() の fields で次のように書けば OK だった。

'fields' => array('EXTRACT(EPOCH FROM "created") AS created_epoch)

created は TIMESTAMP 型のカラム名。psql では、カラム名をダブルクォートで括らなくても動くんだけど、CakePHP の動作がダブルクォートの有無で変わってくる。

例えば、上述のようにダブルクォートで括った場合は、次のような SQL が発行される。

'fields' => array('EXTRACT(EPOCH FROM "created") AS created_epoch)

SELECT EXTRACT(EPOCH FROM "created") AS created_epoch FROM "public"."examples" AS "Example" WHERE 1 = 1

これは期待通りの動作をしてくれる。

ところが、次のようにダブルクォートで括るのを忘れた場合には、正しい SQL にはならない。

'fields' => array('EXTRACT(EPOCH FROM created) AS created_epoch)

SELECT EXTRACT("EPOCH FROM created") AS created_epoch FROM "public"."examples" AS "Example" WHERE 1 = 1

これを実行してもエラーになってしまう。

どうも、CakePHP の PostgreSQL ドライバは「 ( ) の中にクォートがない場合はカッコ内をまるごとクォートする」という動作をしているような気がする(あんまり詳しく追ってない)。