diff --git a/Doctrine/Hydrate.php b/Doctrine/Hydrate.php index 850223c95..86165381d 100644 --- a/Doctrine/Hydrate.php +++ b/Doctrine/Hydrate.php @@ -101,6 +101,13 @@ abstract class Doctrine_Hydrate extends Doctrine_Access { * @return string */ abstract public function getQuery(); + /** + * limitSubqueryUsed + */ + public function isLimitSubqueryUsed() { + return false; + } + /** * remove * @@ -268,7 +275,10 @@ abstract class Doctrine_Hydrate extends Doctrine_Access { default: $keys = array_keys($this->tables); $root = $keys[0]; - + + if($this->isLimitSubqueryUsed()) + $params = array_merge($params, $params); + $stmt = $this->session->execute($query,$params); $previd = array(); diff --git a/Doctrine/Query.php b/Doctrine/Query.php index f0a30a50a..e0d3e6a7f 100644 --- a/Doctrine/Query.php +++ b/Doctrine/Query.php @@ -30,11 +30,15 @@ class Doctrine_Query extends Doctrine_Hydrate { /** * @param array $subqueryAliases the table aliases needed in some LIMIT subqueries */ - private $subqueryAliases = array(); + private $subqueryAliases = array(); /** * @param boolean $needsSubquery */ - private $needsSubquery = false; + private $needsSubquery = false; + /** + * @param boolean $limitSubqueryUsed + */ + private $limitSubqueryUsed = false; /** * count * @@ -242,6 +246,12 @@ class Doctrine_Query extends Doctrine_Hydrate { } return false; } + /** + * @return boolean + */ + public function isLimitSubqueryUsed() { + return true; + } /** * returns the built sql query * @@ -250,12 +260,14 @@ class Doctrine_Query extends Doctrine_Hydrate { public function getQuery() { if(empty($this->parts["select"]) || empty($this->parts["from"])) return false; - + $needsSubQuery = false; $subquery = ''; - if( ! empty($this->parts['limit']) && $this->needsSubquery) + if( ! empty($this->parts['limit']) && $this->needsSubquery) { $needsSubQuery = true; + $this->limitSubqueryUsed = true; + } // build the basic query $q = "SELECT ".implode(", ",$this->parts["select"]). diff --git a/tests/QueryLimitTestCase.php b/tests/QueryLimitTestCase.php index 8d37759dc..df412714a 100644 --- a/tests/QueryLimitTestCase.php +++ b/tests/QueryLimitTestCase.php @@ -94,12 +94,38 @@ class Doctrine_Query_Limit_TestCase extends Doctrine_UnitTestCase { $users[3]->Phonenumber[0]; $this->assertEqual($count, $this->dbh->count()); - $this->assertEqual($this->query->getQuery(), + $this->assertEqual($this->query->getQuery(), 'SELECT entity.id AS entity__id, phonenumber.id AS phonenumber__id, phonenumber.phonenumber AS phonenumber__phonenumber, phonenumber.entity_id AS phonenumber__entity_id FROM entity INNER JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT DISTINCT entity.id FROM entity INNER JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE (entity.type = 0) LIMIT 5 OFFSET 2) AND (entity.type = 0)'); } public function testLimitWithPreparedQueries() { - - } + $q = new Doctrine_Query(); + $q->from("User(id).Phonenumber(id)"); + $q->where("User.name = ?"); + $q->limit(5); + $users = $q->execute(array('zYne')); + + $this->assertEqual($users->count(), 1); + $count = $this->dbh->count(); + $users[0]->Phonenumber[0]; + $this->assertEqual($count, $this->dbh->count()); + + $this->assertEqual($q->getQuery(), + 'SELECT entity.id AS entity__id, phonenumber.id AS phonenumber__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT DISTINCT entity.id FROM entity WHERE entity.name = ? AND (entity.type = 0) LIMIT 5) AND entity.name = ? AND (entity.type = 0)'); + + $q = new Doctrine_Query(); + $q->from("User(id).Phonenumber(id)"); + $q->where("User.name LIKE ? || User.name LIKE ?"); + $q->limit(5); + + $users = $q->execute(array('%zYne%', '%Arnold%')); + $this->assertEqual($users->count(), 2); + $count = $this->dbh->count(); + $users[0]->Phonenumber[0]; + $this->assertEqual($count, $this->dbh->count()); + + $this->assertEqual($q->getQuery(), + "SELECT entity.id AS entity__id, phonenumber.id AS phonenumber__id FROM entity LEFT JOIN phonenumber ON entity.id = phonenumber.entity_id WHERE entity.id IN (SELECT DISTINCT entity.id FROM entity WHERE (entity.name LIKE ? OR entity.name LIKE ?) AND (entity.type = 0) LIMIT 5) AND (entity.name LIKE ? OR entity.name LIKE ?) AND (entity.type = 0)"); + } public function testLimitWithManyToManyLeftJoin() { $q = new Doctrine_Query($this->session); $q->from("User.Group")->limit(5); diff --git a/tests/run.php b/tests/run.php index 509e4bb02..3eaefdf19 100644 --- a/tests/run.php +++ b/tests/run.php @@ -28,7 +28,7 @@ require_once("QueryLimitTestCase.php"); error_reporting(E_ALL); $test = new GroupTest("Doctrine Framework Unit Tests"); - +/** $test->addTestCase(new Doctrine_RecordTestCase()); $test->addTestCase(new Doctrine_SessionTestCase()); @@ -64,10 +64,10 @@ $test->addTestCase(new Doctrine_ValidatorTestCase()); $test->addTestCase(new Doctrine_CollectionTestCase()); $test->addTestCase(new Doctrine_QueryTestCase()); - +*/ $test->addTestCase(new Doctrine_Query_Limit_TestCase()); -$test->addTestCase(new Doctrine_RawSql_TestCase()); +//$test->addTestCase(new Doctrine_RawSql_TestCase()); //$test->addTestCase(new Doctrine_Cache_FileTestCase()); //$test->addTestCase(new Doctrine_Cache_SqliteTestCase());