2009年3月16日月曜日

 

【symfony】CriteriaでBETWEEN句

次の様な、"BETWEEN"句の条件付SQLをsymfonyで発行したい時。

 /* BETWEEN句を使ったSQL文 */
SELECT * FROM datas WHERE create_ad BETWEEN '2008-09-01 00:00:00' AND '2008-09-30 23:59:59'
// 2008年9月中に作成されたデータ

symfonyのサンプルだと2つの方法が載っている。サンプルは“「$date1」と「$date2」のどちらかがある期間内に含まれるか”という条件で複雑。

Simulating a BETWEEN construct - symfony > Code Snippets

Criteria::CUSTOM

一つは「Criteria::CUSTOM」を使って条件文を直接記述する方法。

 /* BETWEEN句 - Criteria::CUSTOMを使った方法 */
$c = new Criteria();
$date_from = '2008-09-01 00:00:00';
$date_to    = '2008-09-30 23:59:59';
$c->add(TestPeer::CREATED_AT, TestPeer::CREATED_AT." between ".$date1." and ".$date2, Criteria::CUSTOM);

getNewCriterion()

もう一つは「getNewCriterion()」を使って複数の条件をカラムに指定する方法。

 /* BETWEEN句 -  getNewCriterion()を使った方法 */
$c = new Criteria();
$date1Criterion = $criteria->getNewCriterion(TestPeer::CREATED_AT, $date_from, Criteria::GREATER_EQUAL);
$date2Criterion = $criteria->getNewCriterion(TestPeer::CREATED_AT, $to_from, Criteria::LESS_EQUAL);
$date1Criterion->addAnd($date2Criterion);
$criteria->add($date1Criterion);

こんなにも回りくどくなる理由は、add()で一つのカラムに複数条件を指定しても最後のみ有効になる仕様だから。以下のリンクに詳しい。

Symfony Tips:同じカラムのAND条件を作る場合のCriteriaの罠 - 開発人日記
 /* add()でBETWEEN条件指定がうまくいかない例 */
$criteria->add(TestPeer::CREATED_AT, $date_from, Criteria::GREATER_EQUAL);
$criteria->add(TestPeer::CREATED_AT, $to_from, Criteria::LESS_EQUAL); // この条件だけ有効

addAnd()

addAnd()」を使って複数条件を指定する方法でも可能。

 /* BETWEEN句 -  addAnd()を使った方法 */
$criteria->add(TestPeer::CREATED_AT, $date_from, Criteria::GREATER_EQUAL);
$criteria->addAnd(TestPeer::CREATED_AT, $to_from, Criteria::LESS_EQUAL);

getNewCriterion()との違いは判らないが、この方法が良さそうだ。

ラベル:


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google