Browse Source

Merge pull request #5108 from cakephp/3.0-pagination-union

3.0 pagination union
Mark Story 11 years ago
parent
commit
5f43bd1826
2 changed files with 19 additions and 5 deletions
  1. 4 3
      src/ORM/Query.php
  2. 15 2
      tests/TestCase/ORM/QueryRegressionTest.php

+ 4 - 3
src/ORM/Query.php

@@ -511,13 +511,14 @@ class Query extends DatabaseQuery implements JsonSerializable {
 		}
 
 		$count = ['count' => $query->func()->count('*')];
-		if (!count($query->clause('group')) && !$query->clause('distinct')) {
+		$complex = count($query->clause('group')) || $query->clause('distinct');
+		$complex = $complex || count($query->clause('union'));
+
+		if (!$complex) {
 			$statement = $query
 				->select($count, true)
 				->execute();
 		} else {
-			// Forcing at least one field to be selected
-			$query->select(['_one_' => $query->newExpr()->add('1')]);
 			$statement = $this->connection()->newQuery()
 				->select($count)
 				->from(['count_source' => $query])

+ 15 - 2
tests/TestCase/ORM/QueryRegressionTest.php

@@ -194,8 +194,7 @@ class QueryRegressionTest extends TestCase {
 		$articles->belongsToMany('Tags');
 		$tags->belongsToMany('Articles');
 
-		$result = $articles->find()->contain(['Tags'])->first();
-		$sub = $articles->Tags->find()->select(['id'])->matching('Articles', function ($q) use ($result) {
+		$sub = $articles->Tags->find()->select(['id'])->matching('Articles', function ($q) {
 			return $q->where(['Articles.id' => 1]);
 		});
 
@@ -522,4 +521,18 @@ class QueryRegressionTest extends TestCase {
 		$this->assertCount(3, $results);
 	}
 
+/**
+ * Tests that calling count on a query having a union works correctly
+ *
+ * @see https://github.com/cakephp/cakephp/issues/5107
+ * @return void
+ */
+	public function testCountWithUnionQuery() {
+		$table = TableRegistry::get('Articles');
+		$query = $table->find()->where(['id' => 1]);
+		$query2 = $table->find()->where(['id' => 2]);
+		$query->union($query2);
+		$this->assertEquals(2, $query->count());
+	}
+
 }