CakePHP 3:数据库具有相同查询的行

时间:2016-11-21 08:40:38

标签: php mysql cakephp cakephp-3.0

我正在努力将特定查询返回的行数限制为使用列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列中存储的日期时间限制行的初始目标。

1 个答案:

答案 0 :(得分:3)

通过使用'Printouts.modified >' => 'NOW() - INTERVAL 30 DAY',您告诉它要查找修改日期大于文字字符串'NOW() - INTERVAL 30 DAY'的列。请改为'Printouts.modified > NOW() - INTERVAL 30 DAY'