【问题标题】:Getting the number of rows considering a time frame考虑时间范围获取行数
【发布时间】:2019-04-10 08:11:51
【问题描述】:

我想在某个时间范围内获取某个表的行数。

我正在使用 CakePHP 3.7。

在这里你可以看到我的代码(来自控制器类):

public function nbOfDefense($dateIn, $dateOut){
        if($dateIn!=null && $dateFin!=null){
            $conditions = array('thesis.date_end BETWEEN ? and ?' => array($dateIn, $dateOut));
            $query = $this->Thesis->find('all',
                array('conditions'=>$conditions));

            die(strval($query->count()));
            return $query;
        }else{
            $query = $this->Thesis->find('all');
            die(strval($query->count()));
            return $query->count();
        }
    }

我正在使用这个 URL 通过我的浏览器测试我的功能:

http://localhost:8888/thesis/nbOfDefense/2003-02-01/2019-04-13

我希望我的函数做的是,获取两个日期的参数:

  • 如果这两个日期不为空,则考虑到您正在咨询的表中存储的日期,您将获得两个日期之间的行数。

  • 如果日期为空,则获取表的总行数。

并返回一个 int,即这两个日期之间的行数。

我觉得这里的问题是我如何处理我的情况,因为计算总行数非常有效(代码的 else 部分)。

我现在使用此代码的错误如下:

无法将array 类型的值转换为字符串

它指向这条线:

die(strval($query->count()));

我猜 count 函数返回一个数组(很奇怪,因为当我在没有条件的情况下计算所有行时它不会)。我也试过这个:

die(strval(sizeof($query->count())));

但我得到与以前相同的错误(无法将数组转换为字符串)

我一定错过了什么,但我不知道是什么......

【问题讨论】:

    标签: cakephp cakephp-3.0 cakephp-3.7


    【解决方案1】:

    尝试:

    use Cake\ORM\Query;
    use Cake\Database\Expression\QueryExpression;
    
    class MyController extend AppController
    {
    
    public function nbOfDefense($dateIn = null, $dateOut = null)
    {
        $query = $this->Thesis->find();
        if ($dateIn && $dateOut) {
            $query->where(function (QueryExpression $exp, Query $q) use ($dateIn, $dateOut) {
                return $exp->between('date_end', $dateIn, $dateOut);
            });
        }
        $count = $query->count();
    
        $this->set(compact('query', 'count'));
    }
    // ..
    }
    

    然后阅读:

    https://book.cakephp.org/3.0/en/orm/query-builder.html https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html

    【讨论】:

    • 感谢您的回答!当我尝试您的代码时,如果日期为空,则它可以完美运行。但是当我尝试设置日期时(通过使用 URL 或在函数的开头编写 $dateIn="2003-02-01"; ),我收到错误:Argument 1 pass to App\Controller\ThesisController \::App\Controller\{closure}() 必须是 App\Controller\QueryExpression 的实例,Cake\Database\Expression\QueryExpression 的实例,在 .../cake3_7/vendor/cakephp/cakephp/src/ 中调用数据库/Query.php。所以我不确定如何测试
    • @createurx 添加:use Cake\ORM\Query;use Cake\Database\Expression\QueryExpression;
    • 天哪!是的,就是这样,非常感谢您的帮助!
    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    相关资源
    最近更新 更多