php - cakephp 3.x 查询中的日期时间字段比较未返回正确结果

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

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

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

最佳答案

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

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

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

当你输出上面的SQL时,它会显示created < :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 < (NOW() - INTERVAL 1 DAY)正如预期的那样。这是因为 CakePHP 检查右边的值是否是一个表达式对象。

关于php - cakephp 3.x 查询中的日期时间字段比较未返回正确结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47899955/

相关文章:

php - 匹配前缀和多个可选后缀,无分隔符

php在函数中测试isset()和empty()

mysql - 在 WHERE 子句中使用 SELECT 子查询不起作用

cakephp - 在 CakePHP 中包含登录/注销链接的最佳方式是什么?

php - 我只想使用 PHP 从文本文件中读取特定行

php - 奇怪的 mysql_update 函数似乎只获取 $this-> info

php - Laravel - 多个表的单个模型

php - 转换 mqsql_query 弃用

cakePHP 分页器未传递 passargs

CakePHP - 如何实现密码的河豚散列?