【问题标题】:CakePHP 3: Empty result set returned while database has rows for same queryCakePHP 3:当数据库具有相同查询的行时返回空结果集
【发布时间】:2016-11-21 08:40:37
【问题描述】:

我正在努力将特定查询返回的行数限制为在过去 30 天内使用列 modified 修改过的行数。此选择的代码如下所示:

            $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 中的日期时间限制行。

【问题讨论】:

    标签: php mysql cakephp cakephp-3.0


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-30
      • 2011-04-11
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多