我正在努力将特定查询返回的行数限制为使用列modified
在过去30天内修改过的行数。这个选择的代码如下:
$conditions = ['Models.receiver' => $Model->receiver,
'Models.status IN' => [40, 50],
//'Models.modified >' => 'NOW() - INTERVAL 30 DAY'
];
$options = [
'limit' => 1,
'conditions' => $conditions,
'order' => ['Models.modified' => 'DESC']
];
$result = $this->Models->find('all', $options)->first();
debug($this->Models->find('all', $options));
在MySQL命令行提示符上执行时的原始查询,不受列modified
上的日期限制,为我提供以下输出:
SELECT
receiver,
status,
modified
FROM
printouts
WHERE
receiver = (INT) X AND
status IN (40, 50)
ORDER BY
modified DESC LIMIT 1;
+----------+--------+---------------------+
| receiver | status | modified |
+----------+--------+---------------------+
| (INT) X | 50 | 2016-11-21 05:33:02 |
+----------+--------+---------------------+
1 row in set (0.00 sec)
CakePHP 3 Controller中收到的相应结果集也是正确的:
object(App\Model\Entity\Model) {
'receiver' => (int) X,
'status' => (int) 50,
'modified' => object(Cake\I18n\Time) {
'time' => '2016-11-21T05:33:02+0000',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'[new]' => false,
'[accessible]' => [
//... removed
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[repository]' => 'Models'
}
这里提到从调试器收到的查询:
object(Cake\ORM\Query) {
'(help)' => 'This is a Query object, to get the results execute or iterate it.',
'sql' => 'SELECT Models.receiver AS `Models__receiver`, Models.status AS `Models__status` Models.modified AS `Models__modified` FROM models Models WHERE (Models.receiver = :c0 AND Models.status in (:c1,:c2)) ORDER BY Models.modified DESC LIMIT 1', // extra columns have been removed for simplicity
'params' => [
':c0' => [
'value' => (int) X,
'type' => 'integer',
'placeholder' => 'c0'
],
':c1' => [
'value' => (int) 40,
'type' => 'integer',
'placeholder' => 'c1'
],
':c2' => [
'value' => (int) 50,
'type' => 'integer',
'placeholder' => 'c2'
]
],
// .... more details
}
现在,我通过取消注释这一行,重新运行同一个查询,修改了列的限制:
'Printouts.modified >' => 'NOW() - INTERVAL 30 DAY'
这次我收到一个空的结果集。 $result
变量在以下行中设置为null
:
$result = $this->Models->find('all', $options)->first();
在MySQL命令行提示符下,原始查询输出仍然保持不变:
SELECT
receiver,
status,
modified
FROM
printouts
WHERE
receiver = (int) X AND
status IN (40, 50) AND
MODIFIED > NOW() - INTERVAL 30 DAY
ORDER BY
modified DESC LIMIT 1;
+----------+--------+---------------------+
| receiver | status | modified |
+----------+--------+---------------------+
| (int) X | 50 | 2016-11-21 05:33:02 |
+----------+--------+---------------------+
1 row in set (0.01 sec)
这次调试同一个查询对象时,我收到以下SQL:
object(Cake\ORM\Query) {
'(help)' => 'This is a Query object, to get the results execute or iterate it.',
'sql' => 'SELECT Models.receiver AS `Models__receiver`, Models.status AS `Models__status`, Models.modified AS `Models__modified` FROM models Models WHERE (Models.receiver = :c0 AND Models.status in (:c1,:c2) AND Models.modified > :c3) ORDER BY Models.modified DESC LIMIT 1',
'params' => [
':c0' => [
'value' => (int) X,
'type' => 'integer',
'placeholder' => 'c0'
],
':c1' => [
'value' => (int) 40,
'type' => 'integer',
'placeholder' => 'c1'
],
':c2' => [
'value' => (int) 50,
'type' => 'integer',
'placeholder' => 'c2'
],
':c3' => [
'value' => 'NOW() - INTERVAL 30 DAY',
'type' => 'datetime',
'placeholder' => 'c3'
]
],
}
假设X
的值始终为整数且相同。 Model
是占位符名称。
如何识别两个查询执行中的差距并删除差异,以实现我按照modified
列中存储的日期时间限制行的初始目标。
答案 0 :(得分:3)
通过使用'Printouts.modified >' => 'NOW() - INTERVAL 30 DAY'
,您告诉它要查找修改日期大于文字字符串'NOW() - INTERVAL 30 DAY'
的列。请改为'Printouts.modified > NOW() - INTERVAL 30 DAY'
。