読者です 読者をやめる 読者になる 読者になる

モノノフ日記

普通の日記です

Propelで同一カラムに対して複数の条件文を使う書き方

知らなくて5分くらいハマったのでメモ。

SQLだとこんなクエリです。

SELECT * FROM TEST WHERE created_at >= "2008-08-01" AND created_at <= "2008-08-31"

これをPropelで書き直すと、下のようなイメージでした。

<?php
$c = new Criteria();
$c->add(TESTPeer::CREATED_AT, "2008-08-01", Criteria::GREATER_EQUAL);
$c->add(TESTPeer::CREATED_AT, "2008-08-31", Criteria::LESS_EQUAL);

return TESTPeer::doSelect($c);

しかし、これだと後から書いた条件("2008-08-31"の方)しか有効になっていませんでした。たぶん、addメソッドは条件を上書きする仕様なんだろうなと予想してソースでも読むかーと思ったけど、その前にGoogle先生に聞いたら同じ事をやっている人を発見。

こんな感じで書けば、Propelで同一カラムに複数条件が使えるそうです。

<?php
$c = new Criteria();
$newcrit = $c->getNewCriterion(TESTPeer::CREATED_AT, "2008-08-01", Criteria::GREATER_EQUAL)->addAnd(
$c->getNewCriterion(TESTPeer::CREATED_AT, "2008-08-31", Criteria::LESS_EQUAL);
$c->add($newcrit);
return TESTPeer::doSelect($c);

Propelメンドクセー。生SQL書いた方が早いと思ってしまった。。
公式のCode Snippetsにも書かれてました。

追記

コメントでtic-toc.infoさんが指摘されてるようにaddAnd()だけでも書けます。
こちらの方が短くて良いですね!

<?php
$c = new Criteria();
$c->add(TESTPeer::CREATED_AT, ”2008-08-01”, Criteria::GREATER_EQUAL);
$c->addAnd(TESTPeer::CREATED_AT, ”2008-08-31”, Criteria::LESS_EQUAL);

return TESTPeer::doSelect($c);