【问题标题】:cakephp 3.x datetime field comparison in query not returning correct result查询中的 cakephp 3.x 日期时间字段比较未返回正确结果
【发布时间】:2017-12-20 06:26:32
【问题描述】:

尝试获取 24 小时或更早创建的所有记录。这里的“created”是一个数据时间字段。我在 DB 中有 3 条记录必须满足此条件,但返回 0 条记录。

$my_table_tbl = TableRegistry::get('my_table');
$records = $my_table_tbl
    ->find()
    ->where([
        'created <' => '(NOW() - INTERVAL 1 DAY)',
        'status' => 'pending'
    ])
    ->toArray();

【问题讨论】:

    标签: php mysql cakephp query-builder cakephp-3.x


    【解决方案1】:

    CakePHP 将始终将子句的右侧视为变量绑定。这意味着(NOW() - INTERVAL 1 DAY) 被解释为字符串值。

    您可以通过将查询转换为字符串来检查生成的 SQL。

    $query = $my_table_tbl->find()
                  ->where([
                     'created <' => '(NOW() - INTERVAL 1 DAY)',
                     'status' => 'pending'
                  ]);
    dd((string)$query);
    

    当您输出上面的 SQL 时,它将显示 created &lt; :c0 而不是您的表达式。

    使用查询对象创建自定义表达式。

    $q = $my_table_tbl->query();
    $query = $my_table_tbl
        ->find()
        ->where([
            'created <' => $q->newExp('(NOW() - INTERVAL 1 DAY)'),
            'status' => 'pending'
        ]);
    dd((string)$query);
    

    当您输出上面的 SQL 时,它将按预期显示 created &lt; (NOW() - INTERVAL 1 DAY)。这是因为 CakePHP 会检查右侧的值是否是表达式对象。

    【讨论】:

    • 为了完整起见,还有FunctionsBuilder::dateAdd()支持生成跨模式兼容的SQL。
    • @cgtag 它对我有用,非常感谢。 newExpr() - 创建行表达式的方法发挥了作用。
    猜你喜欢
    • 2021-06-12
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    相关资源
    最近更新 更多