【问题标题】:Propel Criteria推进标准
【发布时间】:2012-09-15 06:38:17
【问题描述】:

我正在尝试使用 Criteria 和 Propel 创建以下语句:

AND unix_timestamp(table.last_action) > unix_timestamp(table.last_action) -1800

但我似乎无法做到这一点

$kriterien->add(sfGuardUserProfilePeer::LAST_ACTION, 'unix_timestamp(table.last_action)-90', Criteria::GREATER_THEN);

sfGuardUserProfilePeer::LAST_ACTION 不是 unix_timestamp。我怎样才能改变它呢?我已经尝试在BasesGuardUserProfilePeer.php 中简单地更改LAST_ACTION 的值,但它引发了错误。

【问题讨论】:

  • 您为什么要这样做?数据库将无法使用任何索引来解析这部分查询,因为您不必要地应用函数;您不需要使用 UNIX 时间戳来修改日期。 something > something - INTERVAL 1800 SECOND。当然,您的查询是没有意义的,因为列不能大于自身...
  • 什么? :-) 查询工作得非常好something > something - 从现在到半小时前的每一件事都需要 1800 秒
  • 不,something > something - 1800 是每一行。所有数字都大于自身减去某个其他数字。 something > CURRENT_TIMESTAMP - 1800 将是从现在到半小时前的每一行。
  • 是的,你是对的。但是 timestamp1 > timestamp2 是否与 unix_timestamp 一起使用?因为它有点不....
  • 好的,我知道为什么(尽管这对我来说没有意义)。查询结果是 AND sf_guard_user_profile.LETZTE_AKTION > '(CURRENT_TIMESTAMP - INTERVAL 90 SECOND)' 它的工作方式如下 AND sf_guard_user_profile.LETZTE_AKTION > (CURRENT_TIMESTAMP - INTERVAL 90 SECOND)。我怎么把'拿出来?

标签: symfony1 criteria propel


【解决方案1】:

没有像Criteria::GREATER_THEN 这样的常量——也许你的意思是Criteria::GREATER_THAN?但是,如果您使用它,add() 的第二个参数必须是字符串或整数值 - 尝试使用列名或 SQL 函数将不起作用。

相反,试试这个(显然你可能需要调整 - 我不确定你到底想要实现什么):

$kriterien->add(
    sfGuardUserProfilePeer::LAST_ACTION,
    'unix_timestamp(sf_guard_user_profile.last_action) > 90',
    Criteria::CUSTOM
);

最后,Criteria 方法已弃用。你没有说你正在使用什么版本的 Propel(这个细节应该在你的问题中),但是使用最近的东西(1.5 或 1.6)并迁移到 Query 方法是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多