我使用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。
请注意,第一个查询有限制,而第二个查询没有限制。
答案 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();