5

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

4

2 回答 2

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 特定功能。

于 2008-11-03T22:58:31.190 回答
1

只需将您在其中使用的 mysql 日期代码替换为已经包含该日期的预先计算的 php 变量。

IE

$monthAgo = '2008-10-03';
$c = new Criteria
$c->add(FoobarPeer::CREATED_AT, $monthAgo, Criteria::GREATER_THAN); 

显然,您应该在 php 中动态计算日期,而不是对其进行硬编码,但您得到了图片。

于 2008-11-03T23:40:49.043 回答