使用Propel我想查找日期字段不为空且在特定范围之间的记录。
N.B。不幸的是,由于这是更大查询的一部分,我不能在这里使用自定义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之间返回所有具有due_date的行,但我不想返回那些due_date为NULL的记录。
在示例中,我只想返回第2行和第3行。
然而,Propel似乎覆盖了我的NOTNULL标准。
是否可以使用Propel执行此操作?
谢谢!
答案 0 :(得分: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
创建了标准,因此它们将始终替换之前的标准。
答案 1 :(得分:2)
我没有删除空条目部分,我认为它会产生:tasks.due_date IS NULL AND tasks.due_date IS NULL
。
无论如何,也许您可以使用Criteria::CUSTOM
编写raw-SQL WHERE子句? Propel documentation中的示例:
$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);