2010-05-04 80 views
2

使用Propel我希望查找具有不为空的日期字段以及特定范围之间的记录。使用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返回所有的行,但我不t想要返回due_date为NULL的记录。

在这个例子中,我只想要回行2和3

然而,行走似乎覆盖我NOTNULL标准。

可以用Propel做到这一点吗?

谢谢!

回答

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); 

当我尝试这在行走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,所以他们会一直替换以前的标准。

+0

好的 - 我可能只需要升级到Propel 1.4就行了!感谢您的回答。 – 2010-05-05 09:40:12

+0

我在Propel 1.2和1.3中重新测试了这个,我得到了相同的结果。所以虽然你可以升级(现在可以选择1.5,但它对于查询构建来说稳定并且更好),你不需要。 – 2010-05-05 11:15:39

+0

太棒了。感谢您回去为我测试。直到今天晚上,我再也没有机会再看这个问题。 – 2010-05-05 12:12:19

2

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

无论如何,也许你可以使用Criteria::CUSTOM来编写raw-SQL WHERE子句?从行走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); 
+0

感谢您的回答。不幸的是,由于这是一个更大的查询的一部分,因此自定义SQL不可能与我在做什么。 – 2010-05-05 08:23:45