我想选择1个月或更早的记录。

查询是:SELECT * FROM foobar WHERE created_at> DATE_SUB(curdate(),INTERVAL 1 MONTH)

在Symfony中使用Propel,我这样做:

  

$ c =新标准
  $ c-> add(FoobarPeer :: CREATED_AT," DATE_SUB(curdate(),INTERVAL 1 MONTH)",Criteria :: GREATER_THAN);

Propel生成的是:SELECT * FROM foobar WHERE created_at> 'DATE_SUB(curdate(),INTERVAL 1 MONTH)' - 换句话说,它将MySQL函数放在单引号中,这使得它成为一个(无意义的)字符串,我没有记录。

我现在所做的是:

  

$ c-> add(FoobarPeer :: CREATED_AT," created_at> DATE_SUB(curdate(),INTERVAL 1 MONTH)",Criteria :: CUSTOM);

但我不想使用自定义变通方法,除非我必须这样做。除了使用Criteria :: CUSTOM之外的任何提示?

有帮助吗?

解决方案

我认为除了使用Criteria :: CUSTOM或执行这样的自定义SQL查询之外别无选择:

$con = Propel::getConnection(DATABASE_NAME);

$sql = "SELECT foobar.* FROM foobar WHERE created_at > DATE_SUB(curdate(), INTERVAL 1 MONTH)";  
$stmt = $con->prepare($sql);
$stmt->execute();

$books = FoobarPeer::populateObjects($stmt);

这是因为Propel尝试与DBMS无关,通过执行简单的配置值更改来帮助迁移,因此它没有内置任何DBMS特定功能。

其他提示

只需将你在那里使用的mysql日期代码替换为已预先包含该日期的预先计算的php变量。

$monthAgo = '2008-10-03';
$c = new Criteria
$c->add(FoobarPeer::CREATED_AT, $monthAgo, Criteria::GREATER_THAN); 
显然,你应该在php中动态计算日期,而不是硬编码,但是你得到了图片。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top