From d710b19fedd5059abfc0092e63707f798b0032cc Mon Sep 17 00:00:00 2001 From: Alexander Demidov Date: Tue, 3 Jun 2014 19:56:30 +0400 Subject: [PATCH 1/2] Correct use criteria with use count and join. --- model/SqlCriteria.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/model/SqlCriteria.php b/model/SqlCriteria.php index 72c8b23..a0e645d 100644 --- a/model/SqlCriteria.php +++ b/model/SqlCriteria.php @@ -70,6 +70,7 @@ class SqlCriteria $this->sql_expression = 'SELECT ' . $select . ' FROM :table'; } $this->sql_expression .= ' ' . implode(' ', $this->sql_join_expressions); + $this->sql_join_expressions = null; } } @@ -80,13 +81,17 @@ class SqlCriteria public function count() { - if ($this->sql_expression && strpos($this->sql_expression, 'COUNT(*) as count')) { - ; + $this->defineJoinExpressions(); + $sql_expression_backup = $this->sql_expression; + if ($this->sql_expression) { + $select = $this->model->getDb()->selectExpr($this->select, $this->distinct); + $this->sql_expression = str_replace($select, 'COUNT(*) as count', $this->sql_expression); } else { $this->sql_expression = 'SELECT COUNT(*) as count FROM :table'; } - $this->defineJoinExpressions(); - return $this->model->find(array(), '', $this->where, null, null, null, null, $this->sql_expression, $this->sql_expression_params)->fetchField('count'); + $count = $this->model->find(array(), '', $this->where, null, null, null, null, $this->sql_expression, $this->sql_expression_params)->fetchField('count'); + $this->sql_expression = $sql_expression_backup; + return $count; } private function defineJoinTablePlaceholder($table_name) From 52de52a17ad349bb2bbae3842cb1ca7f9adeb16e Mon Sep 17 00:00:00 2001 From: Alexander Demidov Date: Tue, 3 Jun 2014 20:06:56 +0400 Subject: [PATCH 2/2] Fix count --- model/SqlCriteria.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/model/SqlCriteria.php b/model/SqlCriteria.php index a0e645d..67b9a3e 100644 --- a/model/SqlCriteria.php +++ b/model/SqlCriteria.php @@ -83,9 +83,8 @@ class SqlCriteria { $this->defineJoinExpressions(); $sql_expression_backup = $this->sql_expression; - if ($this->sql_expression) { - $select = $this->model->getDb()->selectExpr($this->select, $this->distinct); - $this->sql_expression = str_replace($select, 'COUNT(*) as count', $this->sql_expression); + if ($this->sql_expression && !strstr('COUNT(*)', $this->sql_expression)) { + $this->sql_expression = preg_replace('#^SELECT .+ FROM#', 'SELECT COUNT(*) as count FROM', $this->sql_expression); } else { $this->sql_expression = 'SELECT COUNT(*) as count FROM :table'; }