2

使用 Propel 我想查找日期字段不为空且介于特定范围之间的记录。

NB 不幸的是,由于这是更大查询的一部分,我不能在这里使用自定义 SQL 查询。

例如:我可能有这样的记录:

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

我可能想返回到期日期在 01/01/2010 和 02/01/2010 之间的所有行,但我不想返回到期日期为 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

我没有删除空条目部分,我认为它会产生:tasks.due_date IS NULL AND tasks.due_date IS NULL

无论如何,也许您可Criteria::CUSTOM​​以使用编写 raw-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 回答