2

Propel を使用して、日付フィールドが null ではなく、特定の範囲内にあるレコードを検索したいと考えています。

残念ながら、これはより大きなクエリの一部であるため、ここでカスタム SQL クエリを利用することはできません。

例: 次のようなレコードがあるとします。

---------------------
| ID | DUE_DATE     |
---------------------
| 1  |  NULL        |
| 2  |  01/01/2010  |
| 3  |  02/01/2010  |
| 4  |  NULL        |
| 5  |  05/01/2010  |
---------------------

due_date が 2010 年 1 月 1 日から 2010 年 2 月 1 日までのすべての行を返したいと思うかもしれませんが、due_date が NULL であるレコードは返したくありません。

この例では、行 2 と 3 のみを返したいと考えています。

しかし、Propel は私の NOTNULL 基準を上書きするようです。

Propelでこれを行うことは可能ですか?

ありがとう!

4

2 に答える 2

4

なぜ個別のCriterionオブジェクトを作成するのですか?

$start_date = mktime(0, 0, 0, date("m")  , date("d")+$start, date("Y"));
$end_date = mktime(0, 0, 0, date("m")  , date("d")+$end, date("Y"));

$c = new Criteria();
$c->add(TaskPeer::DUE_DATE, $end_date, Criteria::LESS_EQUAL);
$c->addAnd(TaskPeer::DUE_DATE, $start_date, Criteria::GREATER_EQUAL);
$c->addAnd(TaskPeer::DUE_DATE, null, Criteria::ISNOTNULL);

Propel 1.2、1.3、または 1.4 でこれを試すと、次の SQL ステートメントが表示されます。

SELECT task.TASK_ID, task.DUE_DATE FROM task WHERE ((task.DUE_DATE<=:p1 AND task.DUE_DATE>=:p2) AND task.DUE_DATE IS NOT NULL )

この$c->add()メソッドは、指定されたフィールドの現在の基準を置き換えます。の基準を作成するTaskPeer::DUE_DATEと、以前の基準が常に置き換えられます。

于 2010-05-05T09:21:31.217 に答える
2

null エントリ セクションを削除できませんでした。生成されると思います: tasks.due_date IS NULL AND tasks.due_date IS NULL

とにかく、Criteria::CUSTOM生の SQL WHERE 句を書くために使用できますか? Propelドキュメントの例:

$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);
于 2010-05-05T06:16:26.260 に答える