我想选择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之外的任何提示?
答案 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中动态计算日期,而不是硬编码,但是你得到了图片。