Criteriaの詳細
CriteriaクラスはPropelのSQLをシンプルにする方法です。Criteriaオブジェクトとそれと内部で関係しているCriterionオブジェクトを使うことで、ほとんどのクエリをSQLを書くことなく構築することができます。SQLを直接書く方がシンプルな場合はそうすることをお勧めしますが。
Criteriaオペレーター
Criteriaに条件を追加する場合は様々なオペレーターを指定することができます。正式にサポートされているオペレーターはCriteriaクラス内で定数になっています。(デフォルトのオペレーターはCriteria::EQUALです)。
以下が正式なオペレーターのリストです(これらのオペレーターはCriteria::を先につけて使ってください。例:Criteria::EQUALS)。
- EQUAL (デフォルト)
- NOT_EQUAL
- GREATER_THAN
- LESS_THAN
- GREATER_EQUAL
- LESS_EQUAL
- LIKE
- NOT_LIKE
- IN
- CUSTOM
NULLと同等(Equality)
Criteria::ISNULLやCriteria::ISNOTNULLも存在しますが、デフォルトの同等(Equality)オペレーターを使うのが簡単(でたぶんもっと直感的)でしょう:
<?php // これは: $c = new Criteria(); $c->add(BookPeer::PUBLISHER_ID, null, Criteria::NOT_EQUAL); // ... は以下と同じです: $c = new Criteria(); $c->add(BookPeer::PUBLISHER_ID, null, Criteria::ISNOTNULL); // ... 同じように同等をチェックする場合は、これは: $c = new Criteria(); $c->add(BookPeer::PUBLISHER_ID, null); // ... と同じになります: $c = new Criteria(); $c->add(BookPeer::PUBLISHER_ID, null);
Criteria::CUSTOM
Criteria::CUSTOMオペレーターを使うことでカスタムで条件を追加することができるようになります。実際には行の名前は使われていませんが、Propelがclause mapを作るために指定する必要があります。
<?php $con = Propel::getConnection(ReviewPeer::DATABASE_NAME); $c = new Criteria(); $c->add(ReviewPeer::REVIEW_DATE, 'to_date('.ReviewPeer::REVIEW_DATE.', \'YYYY-MM-DD\') = '.$con->quote($date->format('Y-m-d'), Criteria::CUSTOM);
カスタムオペレーター
既に存在する定数以外にカスタムオペレーターを指定することもできます。これを使うとアプリケーションをポートしにくくなることがあるので注意してください。
<?php $c = new Criteria(); $c->add(BookPeer::TITLE, 'War\s+and', '~*'); // PosgreSQLでのcase-insensitiveな正規表現
大文字こと小文字の区別(Case Sensitivity)
Criteriaに大文字と小文字の区別をさせない場合は、テキスト行のマッチングやソートの際に特別な注意が必要になります。詳細は各RDBMSによって違います。
以下のCriteriaによって構築されるクエリ:
<?php $c = new Criteria(); $c->setIgnoreCase(true); $c->add(BookPeer::TITLE, 'war%', Criteria::LIKE); $c->addAscendingOrderByColumn(BookPeer::TITLE);
... これはPostgreSQLでは以下のようになります:
SELECT .... FROM book WHERE book.TITLE ILIKE 'war%' ORDER BY UPPER(book.TITLE)
ここで使われているオペレーターILIKEはPostgreSQLではMySQLのLIKEと違い大文字と小文字を区別しないことに注意してください。
結合 (Joins)
addJoin(left-col, right-col[, join-type])を使うことでCriteriaに結合を追加することができます。例えば:
<?php $c = new Criteria(); $c->addJoin(ReviewPeer::BOOK_ID, BookPeer::ID, Criteria::INNER_JOIN); $c->add(ReviewPeer::REVIEWER, $someVar);
以下のJOINタイプがサポートされています:
- Criteria::LEFT_JOIN
- Criteria::RIGHT_JOIN
- Criteria::INNER_JOIN
デフォルトのJOINタイプは暗黙の(implicit)joinになります。これはINNER JOINと同じ効果がありますがSQLレベルでは違う書き方になっています。
現在はCriteriaでJOINに複数の条件を付けることはできません(もうすぐできるようになるはずです)。
カスタムSelect行
Criteriaを使ってPropelの結果セットにhydrate(データ取得)する際に使わない行を指定したい場合、カスタムselect行を使うことができます。(Propelは結果セットからオブジェクトを生成する際、全ての行があることが必要ですので、カスタムselect行はオブジェクト生成の際には使うことはできないことに注意してください。)
<?php $m_criteria = new Criteria(); $m_criteria->clearSelectColumns()->addSelectColumn(YourprojectnamePeer::COL_NAME); $stmt = BasePeer::doSelectStmt($m_criteria); while ($row = $stmt->fetch(PDO::FETCH_NUM)) { echo $row[0]; }
