【问题标题】:How to use MySQL functions in Propel如何在 Propel 中使用 MySQL 函数
【发布时间】:2010-09-20 14:06:16
【问题描述】:

我想选择 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 还有什么提示吗?

【问题讨论】:

标签: php orm symfony1 criteria propel


【解决方案1】:

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

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

显然,你应该在php中动态计算日期,而不是硬编码它,但你得到了图片。

【讨论】:

  • 是的,我可以,但我宁愿使用 mysql 函数 - php 对日期运算的支持较弱。
【解决方案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 特定功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多