尝试获取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();
答案 0 :(得分: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 < :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检查右侧的值是否为表达式对象。