cakephp 3.x datetime字段比较查询中没有返回正确的结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cakephp 3.x datetime字段比较查询中没有返回正确的结果相关的知识,希望对你有一定的参考价值。

试图获取24小时或之前创建的所有记录。这里'created'是一个数据时间字段。我在DB中有三条记录必须满足这个条件,但返回0条记录。

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

Cakephp将始终将子句的右侧视为变量绑定。这意味着(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检查右侧的值是否为表达式对象。

以上是关于cakephp 3.x datetime字段比较查询中没有返回正确的结果的主要内容,如果未能解决你的问题,请参考以下文章

CAKEPHP 3.x - 实体更新时出错 - 即使有值,也会声明缺少字段

CakePHP 3.x - 关联错误 - 无法将表链接在一起

从 cakephp 3.x 迁移到 cakephp 4.x [关闭]

cakephp 如何使用一个日期和时间间隔创建和保存表单

CakePHP 3.x 从实体获取相关数据

MySQL 将 DATE 字符串与 DATETIME 字段中的字符串进行比较