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

时间:2015-05-25 22:32:46

标签: cakephp cakephp-3.0

我需要计算用户数,但我的情况是,只有他们的帐户今天已创建。我有一个用户表,每个行都有一个创建的字段(日期时间)。我怎么能在Cakephp中做到这一点,我在文档中找不到答案。

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

我尝试使用CURDATE,当然它没有用,我猜Cakephp有一个特定的日期时间字段功能吗?

3 个答案:

答案 0 :(得分:2)

你在那里做的事情因各种原因而无法工作。

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

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

  3. 虽然可以通过转换列来规避前一个问题,但您应该尽可能避免这种情况!与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'
    

    另见

答案 1 :(得分:1)

你可以这样做

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

请注意,以where(['DATE(created)' => 'CURDATE()'])格式传递它将无效,因为CURDATE()将被解释为字符串。

答案 2 :(得分:0)

在做'created'=&gt;时'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());