WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート [doctrine] DQLでINTERVALやCASE文について

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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

DBはMySqlです。
例えば掲載されてから一週間以内のレコードを取得


$q = Doctrine_Query::create()
->select('u.*')
->from('User u')
->where('CURRENT_TIMESTAMP - INTERVAL 7 DAY < created_at');

$users = $q->execute();
こんな感じでいけます。ただCASE文は駄目なようです。

->where('(CASE WHEN CURRENT_TIMESTAMP - INTERVAL 7 DAY < created_at THEN 1 ELSE 0 END) = 1')

Exception report[Doctrine_Query_Exception]
File :/home/sites/doctrine/lib/Doctrine/Query.php
Line :343
Message :Unknown aggregate alias: CASE
まあ、普通最初のクエリを使うでしょうか問題ないですが、たとえば新しいレコードに今日から1週間以内に登録されたレコードかどうかをフラグとして取ってきてNEWマークをだしたりとか、よくやると思います。

SELECT
u.*,
(CASE WHEN CURRENT_TIMESTAMP - INTERVAL 7 DAY < created_at THEN 1 ELSE 0 END) AS is_new
FROM user u
というようなレコードは色々試しましたが1.1.1現在出来ないようです。まあ、ホスト言語側でどうにでもやりようはありますけど。あとSELECTにINTERVALを入れたりCASTも出来ないようです。

->addSelect('CAST(created_at AS DATE)')
->addSelect('(u.created_at - INTERVAL 7 DAY) as is_new')
両方駄目でした。

joinLeftなんかすごく便利に良く出来てるので、SQLを柔軟にするのは難しいでしょうね。このようなクエリーを使わなくてすむようにDB設計段階から考えて使った方が良さそうです。

もしDQLで書く方法あったらコメントお願いします。


スポンサーサイト

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。