我需要在 Cake 3 中统计今天创建的帐户

I need to count the today created account in Cake 3

我需要统计用户数,但我的条件是他们的账号必须是今天创建的。我有一个用户 table,每行都有一个创建的字段(日期时间)。在Cakephp中怎么实现,我没有在文档中找到答案。

$usersNewCount = Number::format($this->Users->find()->where(['created' => 'CURDATE()'])->count());

我尝试使用 CURDATE,当然它不起作用,我想 Cakephp 对日期时间字段有特定的功能?

在执行 'created' => 'CURDATE()' 时,您正在检查一个完整的匹配项,得到“2015-05-26”,没有时间。您需要检查时间间隔:

$usersNewCount = Number::format(
    $this->Users->find()->where([
        'created >=' => date('Y-m-d').' 00:00:00',
        'created <=' => date('Y-m-d').' 23:59:59'
    ])->count());

你可以这样做

$usersNewCount = Number::format($this->Users->find()->where([
    'DATE(created) = CURDATE()'
])->count());

请注意,以 where(['DATE(created)' => 'CURDATE()']) 形式传递它不会起作用,因为 CURDATE() 将被解释为字符串。

由于各种原因,您在那里所做的工作不会奏效。

  1. 你不能在条件数组的值部分传递 SQL 片段,它会被转义,你最终会得到像 created = 'CURDATE()' 这样的字符串比较,你要么必须将整个条件作为字符串传递,要么使用 raw expressions.

  2. 即使正确传递 CURDATE(),比较也不会起作用,因为 created 列有时间部分。

虽然可以通过转换列来规避前一个问题,但您应该尽可能避免这样做!与 DATE(created) = CURDATE() 这样的计算列相比,将无法使用索引,从而大大降低性能!

因此,除非您有一个仅包含日期部分的额外列,否则最好的选择是 BETWEEN 比较,它等同于 a >= x AND a <= y,并且为了保持跨 DBMS 兼容,这最好通过从 PHP 传递日期来完成,即不要使用 DBMS 特定的日期和时间函数,如 CURDATE().

$this->Users
    ->find()
    ->where(function (\Cake\Database\Expression\QueryExpression $exp, \Cake\ORM\Query $query) {
        $from = (new \DateTime())->setTime(0, 0, 0);
        $to = (new \DateTime())->setTime(23, 59, 59);
        return $exp->between('Users.created', $from, $to, 'datetime');
    })
    ->count()

这将创建一个类似于

的查询
SELECT
    (COUNT(*)) AS `count`
FROM
    users Users
WHERE
    Users.created BETWEEN '2015-05-26 00:00:00' AND '2015-05-26 23:59:59'

另见