如何在Propel中使用MySQL函数

时间:2008-11-03 22:41:20

标签: php orm symfony1 criteria propel

我想选择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之外的任何提示?

2 个答案:

答案 0 :(得分:2)

我认为除了使用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特定功能。

答案 1 :(得分:1)

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

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