在不加倍代码的情况下进行计数查询和查询?

时间:2015-03-13 07:35:35

标签: php yii

我使用Yii和Firebird。我们假设我们有以下代码:

    public function actionGetCustomer($limit = -1, $start = 0) {
            $arr = Yii::app()->db->createCommand()
                            ->select('*')
                            ->from('customer')
                            ->leftJoin('contact', 'customer.idcustomer = contact.idcontact')
                            ->limit($limit, $start)
                            ->queryAll();
            $ans['arr'] => $arr;
            return $ans;
    }

然后我们想要在db中记录记录并具有以下内容:

    public function actionGetCustomer($limit = -1, $start = 0) {
            $arr = Yii::app()->db->createCommand()
                            ->select('*')
                            ->from('customer')
                            ->leftJoin('contact', 'customer.idcustomer = contact.idcontact')
                            ->limit($limit, $start)
                            ->queryAll();
            //copy & paste & edit
            $cnt = Yii::app()->db->createCommand()
                            ->select('count(*)')
                            ->from('customer')
                            ->leftJoin('contact', 'customer.idcustomer = contact.idcontact')
                            ->queryScalar();
            $ans['arr'] => $arr;
            $ans['cnt'] => $cnt;
            return $ans;
    }

要删除代码加倍(实际查询有10个连接和数吨字段)是否可以实现这样的效果?

    public function actionGetCustomer($limit = -1, $start = 0) {
            $cmd = Yii::app()->db->createCommand()
                            ->from('customer')
                            ->leftJoin('contact', 'customer.idcustomer = contact.idcontact');
            $arr = $cmd
                            ->select('*')
                            ->limit($limit, $start)
                            ->queryAll();
            //copy & paste & edit
            $cnt = $cmd
                            ->select('count(*)')
                            ->queryScalar();
            $ans['arr'] => $arr;
            $ans['cnt'] => $cnt;
            return $ans;
    }

试过这个,但db的回答是缓存的(?),尽管改变了选择部分,但查询标量返回了先前查询的结果。还尝试克隆并手动将旧命令的一部分复制到新的但有错误。至于现在,我看到的唯一选择是纯SQL。

请注意,第一个查询有限制,而第二个查询没有限制。

2 个答案:

答案 0 :(得分:1)

您可以像这样计算数组:

count($arr);

哪会给你:

public function actionGetCustomer($limit = -1, $start = 0) {
        $arr = Yii::app()->db->createCommand()
                        ->select('*')
                        ->from('customer')
                        ->leftJoin('contact', 'customer.idcustomer = contact.idcontact')
                        ->limit($limit, $start)
                        ->queryAll();
        return array('arr'=>$arr,'cnt'=>count($arr));
}

如下面的评论所述,这并不能解释LIMIT声明。 如果您不介意在DB上执行两次查询,则可以执行以下操作:

$resultCommand = Yii::app()->db->createCommand()
                        ->select('*')
                        ->from('customer')
                        ->leftJoin('contact', 'customer.idcustomer = contact.idcontact')
                        ->limit($limit, $start);
$countCommand = clone($resultCommand); //answer
$countCommand->setSelect('count(*)');
return array(
             'arr'=>$resultCommand->queryAll(),
             'cnt'=>$countCommand->queryScalar()
            );

答案 1 :(得分:0)

如果您使用的是MySQL,那么您可以在select中使用SQL_CALC_FOUND_ROWS字段,并按照SELECT FOUND_ROWS()进行操作。基本上,这适用于以下示例:

SELECT SQL_CALC_FOUND_ROWS field1, fields2 FROM mytable
   WHERE fieldx ="somevalue" 
   LIMIT 20;

SELECT FOUND_ROWS();

在yii中,您将代码转换为:

$arr = Yii::app()->db->createCommand()
                 ->select('SQL_CALC_FOUND_ROWS (0), *')
                 ->from('customer')
                 ->leftJoin('contact', 'customer.idcustomer = contact.idcontact')
                 ->limit($limit, $start)
                 ->queryAll();

$totalRecords   =  Yii::app()->db->createCommand('SELECT FOUND_ROWS()')->queryScalar();