diff --git a/lib/Doctrine/ORM/AbstractQuery.php b/lib/Doctrine/ORM/AbstractQuery.php index 0003c5d3ff5..3ba49b08866 100644 --- a/lib/Doctrine/ORM/AbstractQuery.php +++ b/lib/Doctrine/ORM/AbstractQuery.php @@ -822,8 +822,9 @@ public function getSingleResult($hydrationMode = null) * * Alias for getSingleResult(HYDRATE_SINGLE_SCALAR). * - * @return mixed The scalar result, or NULL if the query returned no result. + * @return mixed The scalar result. * + * @throws NoResultException If the query returned no result. * @throws NonUniqueResultException If the query result is not unique. */ public function getSingleScalarResult() diff --git a/lib/Doctrine/ORM/Version.php b/lib/Doctrine/ORM/Version.php index a22c9690773..53297999976 100644 --- a/lib/Doctrine/ORM/Version.php +++ b/lib/Doctrine/ORM/Version.php @@ -35,7 +35,7 @@ class Version /** * Current Doctrine Version */ - const VERSION = '2.6.4-DEV'; + const VERSION = '2.6.5-DEV'; /** * Compares a Doctrine version with the current one. diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsAddress.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsAddress.php new file mode 100644 index 00000000000..f25e295466f --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsAddress.php @@ -0,0 +1,250 @@ +id; + } + + public function getUser() { + return $this->user; + } + + public function getCountry() { + return $this->country; + } + + public function getZipCode() { + return $this->zip; + } + + public function getCity() { + return $this->city; + } + + public function setUser(CmsUser $user) { + if ($this->user !== $user) { + $this->user = $user; + $user->setAddress($this); + } + } + + public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadataInfo $metadata) + { + $metadata->setPrimaryTable( + [ + 'name' => 'company_person', + ] + ); + + $metadata->mapField( + [ + 'id' => true, + 'fieldName' => 'id', + 'type' => 'integer', + ] + ); + + $metadata->mapField( + [ + 'fieldName' => 'zip', + 'length' => 50, + ] + ); + + $metadata->mapField( + [ + 'fieldName' => 'city', + 'length' => 50, + ] + ); + + $metadata->mapOneToOne( + [ + 'fieldName' => 'user', + 'targetEntity' => 'CmsUser', + 'joinColumns' => [['referencedColumnName' => 'id']] + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'find-all', + 'query' => 'SELECT id, country, city FROM cms_addresses_customid', + 'resultSetMapping' => 'mapping-find-all', + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'find-by-id', + 'query' => 'SELECT * FROM cms_addresses_customid WHERE id = ?', + 'resultClass' => CmsAddress::class, + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'count', + 'query' => 'SELECT COUNT(*) AS count FROM cms_addresses_customid', + 'resultSetMapping' => 'mapping-count', + ] + ); + + $metadata->addSqlResultSetMapping( + [ + 'name' => 'mapping-find-all', + 'columns' => [], + 'entities' => [ + [ + 'fields' => [ + [ + 'name' => 'id', + 'column' => 'id', + ], + [ + 'name' => 'city', + 'column' => 'city', + ], + [ + 'name' => 'country', + 'column' => 'country', + ], + ], + 'entityClass' => CmsAddress::class, + ], + ], + ] + ); + + $metadata->addSqlResultSetMapping( + [ + 'name' => 'mapping-without-fields', + 'columns' => [], + 'entities' => [ + [ + 'entityClass' => CmsAddress::class, + 'fields' => [] + ] + ] + ] + ); + + $metadata->addSqlResultSetMapping( + [ + 'name' => 'mapping-count', + 'columns' => [ + [ + 'name' => 'count', + ], + ] + ] + ); + + $metadata->addEntityListener(\Doctrine\ORM\Events::postPersist, 'CmsAddressListener', 'postPersist'); + $metadata->addEntityListener(\Doctrine\ORM\Events::prePersist, 'CmsAddressListener', 'prePersist'); + + $metadata->addEntityListener(\Doctrine\ORM\Events::postUpdate, 'CmsAddressListener', 'postUpdate'); + $metadata->addEntityListener(\Doctrine\ORM\Events::preUpdate, 'CmsAddressListener', 'preUpdate'); + + $metadata->addEntityListener(\Doctrine\ORM\Events::postRemove, 'CmsAddressListener', 'postRemove'); + $metadata->addEntityListener(\Doctrine\ORM\Events::preRemove, 'CmsAddressListener', 'preRemove'); + + $metadata->addEntityListener(\Doctrine\ORM\Events::preFlush, 'CmsAddressListener', 'preFlush'); + $metadata->addEntityListener(\Doctrine\ORM\Events::postLoad, 'CmsAddressListener', 'postLoad'); + } +} diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsAddressListener.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsAddressListener.php new file mode 100644 index 00000000000..ccd8be723ee --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsAddressListener.php @@ -0,0 +1,58 @@ +calls[__FUNCTION__][] = func_get_args(); + } + + public function postPersist() + { + $this->calls[__FUNCTION__][] = func_get_args(); + } + + public function preUpdate() + { + $this->calls[__FUNCTION__][] = func_get_args(); + } + + public function postUpdate() + { + $this->calls[__FUNCTION__][] = func_get_args(); + } + + public function preRemove() + { + $this->calls[__FUNCTION__][] = func_get_args(); + } + + public function postRemove() + { + $this->calls[__FUNCTION__][] = func_get_args(); + } + + public function postLoad() + { + $this->calls[__FUNCTION__][] = func_get_args(); + } + + public function preFlush() + { + $this->calls[__FUNCTION__][] = func_get_args(); + } + + protected function postPersistHandler() + { + throw new \BadMethodCallException("This is not a valid callback"); + } + + protected function prePersistHandler() + { + throw new \BadMethodCallException("This is not a valid callback"); + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsArticle.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsArticle.php new file mode 100644 index 00000000000..e1d864f42d4 --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsArticle.php @@ -0,0 +1,48 @@ +user = $author; + } + + public function addComment(CmsComment $comment) { + $this->comments[] = $comment; + $comment->setArticle($this); + } +} diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsComment.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsComment.php new file mode 100644 index 00000000000..661d3982871 --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsComment.php @@ -0,0 +1,38 @@ +article = $article; + } + + public function __toString() { + return __CLASS__."[id=".$this->id."]"; + } +} diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsEmail.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsEmail.php new file mode 100644 index 00000000000..b0666baa3b1 --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsEmail.php @@ -0,0 +1,49 @@ +id; + } + + public function getEmail() { + return $this->email; + } + + public function setEmail($email) { + $this->email = $email; + } + + public function getUser() { + return $this->user; + } + + public function setUser(CmsUser $user) { + $this->user = $user; + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsGroup.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsGroup.php new file mode 100644 index 00000000000..8c94b26618c --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsGroup.php @@ -0,0 +1,45 @@ +name = $name; + } + + public function getName() { + return $this->name; + } + + public function addUser(CmsUser $user) { + $this->users[] = $user; + } + + public function getUsers() { + return $this->users; + } +} + diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsPhonenumber.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsPhonenumber.php new file mode 100644 index 00000000000..9b4496ba6f3 --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsPhonenumber.php @@ -0,0 +1,28 @@ +user = $user; + } + + public function getUser() { + return $this->user; + } +} diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsTag.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsTag.php new file mode 100644 index 00000000000..1396e3e1f08 --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsTag.php @@ -0,0 +1,44 @@ +name = $name; + } + + public function getName() { + return $this->name; + } + + public function addUser(CmsUser $user) { + $this->users[] = $user; + } + + public function getUsers() { + return $this->users; + } +} + diff --git a/tests/Doctrine/Tests/Models/CMSCustomId/CmsUser.php b/tests/Doctrine/Tests/Models/CMSCustomId/CmsUser.php new file mode 100644 index 00000000000..33275c52743 --- /dev/null +++ b/tests/Doctrine/Tests/Models/CMSCustomId/CmsUser.php @@ -0,0 +1,485 @@ +phonenumbers = new ArrayCollection; + $this->articles = new ArrayCollection; + $this->groups = new ArrayCollection; + $this->tags = new ArrayCollection; + } + + public function getId() { + return $this->id; + } + + public function getStatus() { + return $this->status; + } + + public function getUsername() { + return $this->username; + } + + public function getName() { + return $this->name; + } + + /** + * Adds a phonenumber to the user. + * + * @param CmsPhonenumber $phone + */ + public function addPhonenumber(CmsPhonenumber $phone) { + $this->phonenumbers[] = $phone; + $phone->setUser($this); + } + + public function getPhonenumbers() { + return $this->phonenumbers; + } + + public function addArticle(CmsArticle $article) { + $this->articles[] = $article; + $article->setAuthor($this); + } + + public function addGroup(CmsGroup $group) { + $this->groups[] = $group; + $group->addUser($this); + } + + public function getGroups() { + return $this->groups; + } + + public function addTag(CmsTag $tag) { + $this->tags[] = $tag; + $tag->addUser($this); + } + + public function getTags() { + return $this->tags; + } + + public function removePhonenumber($index) { + if (isset($this->phonenumbers[$index])) { + $ph = $this->phonenumbers[$index]; + unset($this->phonenumbers[$index]); + $ph->user = null; + return true; + } + return false; + } + + public function getAddress() { return $this->address; } + + public function setAddress(CmsAddress $address) { + if ($this->address !== $address) { + $this->address = $address; + $address->setUser($this); + } + } + + /** + * @return CmsEmail + */ + public function getEmail() { return $this->email; } + + public function setEmail(CmsEmail $email = null) { + if ($this->email !== $email) { + $this->email = $email; + + if ($email) { + $email->setUser($this); + } + } + } + + public static function loadMetadata(\Doctrine\ORM\Mapping\ClassMetadataInfo $metadata) + { + $metadata->setPrimaryTable( + [ + 'name' => 'cms_users_customid', + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'fetchIdAndUsernameWithResultClass', + 'query' => 'SELECT id, username FROM cms_users_customid WHERE username = ?', + 'resultClass' => CmsUser::class, + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'fetchAllColumns', + 'query' => 'SELECT * FROM cms_users_customid WHERE username = ?', + 'resultClass' => CmsUser::class, + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'fetchJoinedAddress', + 'query' => 'SELECT u.id, u.name, u.status, a.id AS a_id, a.country, a.zip, a.city FROM cms_users_customid u INNER JOIN cms_addresses_customid a ON u.id = a.user_id WHERE u.username = ?', + 'resultSetMapping' => 'mappingJoinedAddress', + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'fetchJoinedPhonenumber', + 'query' => 'SELECT id, name, status, phonenumber AS number FROM cms_users_customid INNER JOIN cms_phonenumbers_customid ON id = user_id WHERE username = ?', + 'resultSetMapping' => 'mappingJoinedPhonenumber', + ] + ); + + $metadata->addNamedNativeQuery( + [ + 'name' => 'fetchUserPhonenumberCount', + 'query' => 'SELECT id, name, status, COUNT(phonenumber) AS numphones FROM cms_users_customid INNER JOIN cms_phonenumbers_customid ON id = user_id WHERE username IN (?) GROUP BY id, name, status, username ORDER BY username', + 'resultSetMapping' => 'mappingUserPhonenumberCount', + ] + ); + + $metadata->addNamedNativeQuery( + [ + "name" => "fetchMultipleJoinsEntityResults", + "resultSetMapping" => "mappingMultipleJoinsEntityResults", + "query" => "SELECT u.id AS u_id, u.name AS u_name, u.status AS u_status, a.id AS a_id, a.zip AS a_zip, a.country AS a_country, COUNT(p.phonenumber) AS numphones FROM cms_users_customid u INNER JOIN cms_addresses_customid a ON u.id = a.user_id INNER JOIN cms_phonenumbers_customid p ON u.id = p.user_id GROUP BY u.id, u.name, u.status, u.username, a.id, a.zip, a.country ORDER BY u.username" + ] + ); + + $metadata->addSqlResultSetMapping( + [ + 'name' => 'mappingJoinedAddress', + 'columns' => [], + 'entities' => [ + [ + 'fields'=> [ + [ + 'name' => 'id', + 'column' => 'id', + ], + [ + 'name' => 'name', + 'column' => 'name', + ], + [ + 'name' => 'status', + 'column' => 'status', + ], + [ + 'name' => 'address.zip', + 'column' => 'zip', + ], + [ + 'name' => 'address.city', + 'column' => 'city', + ], + [ + 'name' => 'address.country', + 'column' => 'country', + ], + [ + 'name' => 'address.id', + 'column' => 'a_id', + ], + ], + 'entityClass' => CmsUser::class, + 'discriminatorColumn' => null + ], + ], + ] + ); + + $metadata->addSqlResultSetMapping( + [ + 'name' => 'mappingJoinedPhonenumber', + 'columns' => [], + 'entities' => [ + [ + 'fields'=> [ + [ + 'name' => 'id', + 'column' => 'id', + ], + [ + 'name' => 'name', + 'column' => 'name', + ], + [ + 'name' => 'status', + 'column' => 'status', + ], + [ + 'name' => 'phonenumbers.phonenumber', + 'column' => 'number', + ], + ], + 'entityClass' => CmsUser::class, + 'discriminatorColumn' => null + ], + ], + ] + ); + + $metadata->addSqlResultSetMapping( + [ + 'name' => 'mappingUserPhonenumberCount', + 'columns' => [], + 'entities' => [ + [ + 'fields' => [ + [ + 'name' => 'id', + 'column' => 'id', + ], + [ + 'name' => 'name', + 'column' => 'name', + ], + [ + 'name' => 'status', + 'column' => 'status', + ] + ], + 'entityClass' => CmsUser::class, + 'discriminatorColumn' => null + ] + ], + 'columns' => [ + [ + 'name' => 'numphones', + ] + ] + ] + ); + + $metadata->addSqlResultSetMapping( + [ + 'name' => 'mappingMultipleJoinsEntityResults', + 'entities' => [ + [ + 'fields' => [ + [ + 'name' => 'id', + 'column' => 'u_id', + ], + [ + 'name' => 'name', + 'column' => 'u_name', + ], + [ + 'name' => 'status', + 'column' => 'u_status', + ] + ], + 'entityClass' => CmsUser::class, + 'discriminatorColumn' => null, + ], + [ + 'fields' => [ + [ + 'name' => 'id', + 'column' => 'a_id', + ], + [ + 'name' => 'zip', + 'column' => 'a_zip', + ], + [ + 'name' => 'country', + 'column' => 'a_country', + ], + ], + 'entityClass' => CmsAddress::class, + 'discriminatorColumn' => null, + ], + ], + 'columns' => [ + [ + 'name' => 'numphones', + ] + ] + ] + ); + + } +} diff --git a/tests/Doctrine/Tests/ORM/Functional/PaginationCustomTypeIdTest.php b/tests/Doctrine/Tests/ORM/Functional/PaginationCustomTypeIdTest.php new file mode 100644 index 00000000000..f3f1df5e349 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Functional/PaginationCustomTypeIdTest.php @@ -0,0 +1,795 @@ +useModelSet('cmscustomid'); + $this->useModelSet('pagination'); + $this->useModelSet('company'); + parent::setUp(); + $this->populate(); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testCountSimpleWithoutJoin($useOutputWalkers) + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->setUseOutputWalkers($useOutputWalkers); + $this->assertCount(9, $paginator); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testCountWithFetchJoin($useOutputWalkers) + { + $dql = 'SELECT u,g FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->setUseOutputWalkers($useOutputWalkers); + $this->assertCount(9, $paginator); + } + + public function testCountComplexWithOutputWalker() + { + $dql = 'SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMSCustomId\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->setUseOutputWalkers(true); + $this->assertCount(3, $paginator); + } + + public function testCountComplexWithoutOutputWalker() + { + $dql = 'SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMSCustomId\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->setUseOutputWalkers(false); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Cannot count query that uses a HAVING clause. Use the output walkers for pagination'); + + $this->assertCount(3, $paginator); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testCountWithComplexScalarOrderBy($useOutputWalkers) + { + $dql = 'SELECT l FROM Doctrine\Tests\Models\Pagination\Logo l ORDER BY l.image_width * l.image_height DESC'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->setUseOutputWalkers($useOutputWalkers); + $this->assertCount(9, $paginator); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testIterateSimpleWithoutJoin($useOutputWalkers, $fetchJoinCollection) + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $this->assertCount(9, $paginator->getIterator()); + + // Test with limit + $query->setMaxResults(3); + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $this->assertCount(3, $paginator->getIterator()); + + // Test with limit and offset + $query->setMaxResults(3)->setFirstResult(4); + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $this->assertCount(3, $paginator->getIterator()); + } + + private function iterateWithOrderAsc($useOutputWalkers, $fetchJoinCollection, $baseDql, $checkField) + { + // Ascending + $dql = "$baseDql ASC"; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $iter = $paginator->getIterator(); + $this->assertCount(9, $iter); + $result = iterator_to_array($iter); + $this->assertEquals($checkField . "0", $result[0]->$checkField); + } + + private function iterateWithOrderAscWithLimit($useOutputWalkers, $fetchJoinCollection, $baseDql, $checkField) + { + // Ascending + $dql = "$baseDql ASC"; + $query = $this->_em->createQuery($dql); + + // With limit + $query->setMaxResults(3); + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $iter = $paginator->getIterator(); + $this->assertCount(3, $iter); + $result = iterator_to_array($iter); + $this->assertEquals($checkField . "0", $result[0]->$checkField); + } + + private function iterateWithOrderAscWithLimitAndOffset($useOutputWalkers, $fetchJoinCollection, $baseDql, $checkField) + { + // Ascending + $dql = "$baseDql ASC"; + $query = $this->_em->createQuery($dql); + + // With offset + $query->setMaxResults(3)->setFirstResult(3); + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $iter = $paginator->getIterator(); + $this->assertCount(3, $iter); + $result = iterator_to_array($iter); + $this->assertEquals($checkField . "3", $result[0]->$checkField); + } + + private function iterateWithOrderDesc($useOutputWalkers, $fetchJoinCollection, $baseDql, $checkField) + { + $dql = "$baseDql DESC"; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $iter = $paginator->getIterator(); + $this->assertCount(9, $iter); + $result = iterator_to_array($iter); + $this->assertEquals($checkField . "8", $result[0]->$checkField); + } + + private function iterateWithOrderDescWithLimit($useOutputWalkers, $fetchJoinCollection, $baseDql, $checkField) + { + $dql = "$baseDql DESC"; + $query = $this->_em->createQuery($dql); + + // With limit + $query->setMaxResults(3); + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $iter = $paginator->getIterator(); + $this->assertCount(3, $iter); + $result = iterator_to_array($iter); + $this->assertEquals($checkField . "8", $result[0]->$checkField); + } + + private function iterateWithOrderDescWithLimitAndOffset($useOutputWalkers, $fetchJoinCollection, $baseDql, $checkField) + { + $dql = "$baseDql DESC"; + $query = $this->_em->createQuery($dql); + + // With offset + $query->setMaxResults(3)->setFirstResult(3); + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalkers); + $iter = $paginator->getIterator(); + $this->assertCount(3, $iter); + $result = iterator_to_array($iter); + $this->assertEquals($checkField . "5", $result[0]->$checkField); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testIterateSimpleWithoutJoinWithOrder($useOutputWalkers, $fetchJoinCollection) + { + // Ascending + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u ORDER BY u.username'; + $this->iterateWithOrderAsc($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + $this->iterateWithOrderDesc($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testIterateSimpleWithoutJoinWithOrderAndLimit($useOutputWalkers, $fetchJoinCollection) + { + // Ascending + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u ORDER BY u.username'; + $this->iterateWithOrderAscWithLimit($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + $this->iterateWithOrderDescWithLimit($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testIterateSimpleWithoutJoinWithOrderAndLimitAndOffset($useOutputWalkers, $fetchJoinCollection) + { + // Ascending + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u ORDER BY u.username'; + $this->iterateWithOrderAscWithLimitAndOffset($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + $this->iterateWithOrderDescWithLimitAndOffset($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateSimpleWithOutputWalkerWithoutJoinWithComplexOrder($fetchJoinCollection) + { + // Ascending + $dql = 'SELECT l FROM Doctrine\Tests\Models\Pagination\Logo l ORDER BY l.image_width * l.image_height'; + $this->iterateWithOrderAsc(true, $fetchJoinCollection, $dql, "image"); + $this->iterateWithOrderDesc(true, $fetchJoinCollection, $dql, "image"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateSimpleWithOutputWalkerWithoutJoinWithComplexOrderAndLimit($fetchJoinCollection) + { + // Ascending + $dql = 'SELECT l FROM Doctrine\Tests\Models\Pagination\Logo l ORDER BY l.image_width * l.image_height'; + $this->iterateWithOrderAscWithLimit(true, $fetchJoinCollection, $dql, "image"); + $this->iterateWithOrderDescWithLimit(true, $fetchJoinCollection, $dql, "image"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateSimpleWithOutputWalkerWithoutJoinWithComplexOrderAndLimitAndOffset($fetchJoinCollection) + { + // Ascending + $dql = 'SELECT l FROM Doctrine\Tests\Models\Pagination\Logo l ORDER BY l.image_width * l.image_height'; + $this->iterateWithOrderAscWithLimitAndOffset(true, $fetchJoinCollection, $dql, "image"); + $this->iterateWithOrderDescWithLimitAndOffset(true, $fetchJoinCollection, $dql, "image"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoin($useOutputWalkers) + { + $dql = 'SELECT u,g FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query, true); + $paginator->setUseOutputWalkers($useOutputWalkers); + $this->assertCount(9, $paginator->getIterator()); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinWithOrder($useOutputWalkers) + { + $dql = 'SELECT u,g FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g ORDER BY u.username'; + $this->iterateWithOrderAsc($useOutputWalkers, true, $dql, "username"); + $this->iterateWithOrderDesc($useOutputWalkers, true, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinWithOrderAndLimit($useOutputWalkers) + { + $dql = 'SELECT u,g FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g ORDER BY u.username'; + $this->iterateWithOrderAscWithLimit($useOutputWalkers, true, $dql, "username"); + $this->iterateWithOrderDescWithLimit($useOutputWalkers, true, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinWithOrderAndLimitAndOffset($useOutputWalkers) + { + $dql = 'SELECT u,g FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g ORDER BY u.username'; + $this->iterateWithOrderAscWithLimitAndOffset($useOutputWalkers, true, $dql, "username"); + $this->iterateWithOrderDescWithLimitAndOffset($useOutputWalkers, true, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testIterateWithRegularJoinWithOrderByColumnFromJoined($useOutputWalkers, $fetchJoinCollection) + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.email e ORDER BY e.email'; + $this->iterateWithOrderAsc($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + $this->iterateWithOrderDesc($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testIterateWithRegularJoinWithOrderByColumnFromJoinedWithLimit($useOutputWalkers, $fetchJoinCollection) + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.email e ORDER BY e.email'; + $this->iterateWithOrderAscWithLimit($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + $this->iterateWithOrderDescWithLimit($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testIterateWithRegularJoinWithOrderByColumnFromJoinedWithLimitAndOffset($useOutputWalkers, $fetchJoinCollection) + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.email e ORDER BY e.email'; + $this->iterateWithOrderAscWithLimitAndOffset($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + $this->iterateWithOrderDescWithLimitAndOffset($useOutputWalkers, $fetchJoinCollection, $dql, "username"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateWithOutputWalkersWithRegularJoinWithComplexOrderByReferencingJoined($fetchJoinCollection) + { + // long function name is loooooooooooong + + $dql = 'SELECT c FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.logo l ORDER BY l.image_height * l.image_width'; + $this->iterateWithOrderAsc(true, $fetchJoinCollection, $dql, "name"); + $this->iterateWithOrderDesc(true, $fetchJoinCollection, $dql, "name"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateWithOutputWalkersWithRegularJoinWithComplexOrderByReferencingJoinedWithLimit($fetchJoinCollection) + { + // long function name is loooooooooooong + + $dql = 'SELECT c FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.logo l ORDER BY l.image_height * l.image_width'; + $this->iterateWithOrderAscWithLimit(true, $fetchJoinCollection, $dql, "name"); + $this->iterateWithOrderDescWithLimit(true, $fetchJoinCollection, $dql, "name"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateWithOutputWalkersWithRegularJoinWithComplexOrderByReferencingJoinedWithLimitAndOffset($fetchJoinCollection) + { + // long function name is loooooooooooong + + $dql = 'SELECT c FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.logo l ORDER BY l.image_height * l.image_width'; + $this->iterateWithOrderAscWithLimitAndOffset(true, $fetchJoinCollection, $dql, "name"); + $this->iterateWithOrderDescWithLimitAndOffset(true, $fetchJoinCollection, $dql, "name"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinWithOrderByColumnFromJoined($useOutputWalkers) + { + $dql = 'SELECT u,g,e FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g JOIN u.email e ORDER BY e.email'; + $this->iterateWithOrderAsc($useOutputWalkers, true, $dql, "username"); + $this->iterateWithOrderDesc($useOutputWalkers, true, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinWithOrderByColumnFromJoinedWithLimit($useOutputWalkers) + { + $dql = 'SELECT u,g,e FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g JOIN u.email e ORDER BY e.email'; + $this->iterateWithOrderAscWithLimit($useOutputWalkers, true, $dql, "username"); + $this->iterateWithOrderDescWithLimit($useOutputWalkers, true, $dql, "username"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinWithOrderByColumnFromJoinedWithLimitAndOffset($useOutputWalkers) + { + $dql = 'SELECT u,g,e FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u JOIN u.groups g JOIN u.email e ORDER BY e.email'; + $this->iterateWithOrderAscWithLimitAndOffset($useOutputWalkers, true, $dql, "username"); + $this->iterateWithOrderDescWithLimitAndOffset($useOutputWalkers, true, $dql, "username"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateWithOutputWalkersWithFetchJoinWithComplexOrderByReferencingJoined($fetchJoinCollection) + { + $dql = 'SELECT c,l FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.logo l ORDER BY l.image_width * l.image_height'; + $this->iterateWithOrderAsc(true, $fetchJoinCollection, $dql, "name"); + $this->iterateWithOrderDesc(true, $fetchJoinCollection, $dql, "name"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateWithOutputWalkersWithFetchJoinWithComplexOrderByReferencingJoinedWithLimit($fetchJoinCollection) + { + $dql = 'SELECT c,l FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.logo l ORDER BY l.image_width * l.image_height'; + $this->iterateWithOrderAscWithLimit(true, $fetchJoinCollection, $dql, "name"); + $this->iterateWithOrderDescWithLimit(true, $fetchJoinCollection, $dql, "name"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateWithOutputWalkersWithFetchJoinWithComplexOrderByReferencingJoinedWithLimitAndOffset($fetchJoinCollection) + { + $dql = 'SELECT c,l FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.logo l ORDER BY l.image_width * l.image_height'; + $this->iterateWithOrderAscWithLimitAndOffset(true, $fetchJoinCollection, $dql, "name"); + $this->iterateWithOrderDescWithLimitAndOffset(true, $fetchJoinCollection, $dql, "name"); + } + + /** + * @dataProvider fetchJoinCollection + */ + public function testIterateWithOutputWalkersWithFetchJoinWithComplexOrderByReferencingJoinedWithLimitAndOffsetWithInheritanceType($fetchJoinCollection) + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\Pagination\User u ORDER BY u.id'; + $this->iterateWithOrderAscWithLimit(true, $fetchJoinCollection, $dql, "name"); + $this->iterateWithOrderDescWithLimit(true, $fetchJoinCollection, $dql, "name"); + } + + public function testIterateComplexWithOutputWalker() + { + $dql = 'SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMSCustomId\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->setUseOutputWalkers(true); + $this->assertCount(3, $paginator->getIterator()); + } + + public function testJoinedClassTableInheritance() + { + $dql = 'SELECT c FROM Doctrine\Tests\Models\Company\CompanyManager c ORDER BY c.startDate'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $this->assertCount(1, $paginator->getIterator()); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromBoth($useOutputWalkers) + { + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY c.name'; + $dqlAsc = $dql . " ASC, d.name"; + $dqlDesc = $dql . " DESC, d.name"; + $this->iterateWithOrderAsc($useOutputWalkers, true, $dqlAsc, "name"); + $this->iterateWithOrderDesc($useOutputWalkers, true, $dqlDesc, "name"); + } + + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromBothWithLimitWithOutputWalker() + { + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY c.name'; + $dqlAsc = $dql . " ASC, d.name"; + $dqlDesc = $dql . " DESC, d.name"; + $this->iterateWithOrderAscWithLimit(true, true, $dqlAsc, "name"); + $this->iterateWithOrderDescWithLimit(true, true, $dqlDesc, "name"); + } + + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromBothWithLimitWithoutOutputWalker() + { + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Cannot select distinct identifiers from query with LIMIT and ORDER BY on a column from a fetch joined to-many association. Use output walkers.'); + + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY c.name'; + $dqlAsc = $dql . " ASC, d.name"; + $dqlDesc = $dql . " DESC, d.name"; + $this->iterateWithOrderAscWithLimit(false, true, $dqlAsc, "name"); + $this->iterateWithOrderDescWithLimit(false, true, $dqlDesc, "name"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromRoot($useOutputWalkers) + { + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY c.name'; + $this->iterateWithOrderAsc($useOutputWalkers, true, $dql, "name"); + $this->iterateWithOrderDesc($useOutputWalkers, true, $dql, "name"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromRootWithLimit($useOutputWalkers) + { + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY c.name'; + $this->iterateWithOrderAscWithLimit($useOutputWalkers, true, $dql, "name"); + $this->iterateWithOrderDescWithLimit($useOutputWalkers, true, $dql, "name"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromRootWithLimitAndOffset($useOutputWalkers) + { + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY c.name'; + $this->iterateWithOrderAscWithLimitAndOffset($useOutputWalkers, true, $dql, "name"); + $this->iterateWithOrderDescWithLimitAndOffset($useOutputWalkers, true, $dql, "name"); + } + + /** + * @dataProvider useOutputWalkers + */ + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromJoined($useOutputWalkers) + { + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY d.name'; + $this->iterateWithOrderAsc($useOutputWalkers, true, $dql, "name"); + $this->iterateWithOrderDesc($useOutputWalkers, true, $dql, "name"); + } + + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromJoinedWithLimitWithOutputWalker() + { + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY d.name'; + $this->iterateWithOrderAscWithLimit(true, true, $dql, "name"); + $this->iterateWithOrderDescWithLimit(true, true, $dql, "name"); + } + + public function testIterateWithFetchJoinOneToManyWithOrderByColumnFromJoinedWithLimitWithoutOutputWalker() + { + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Cannot select distinct identifiers from query with LIMIT and ORDER BY on a column from a fetch joined to-many association. Use output walkers.'); + + $dql = 'SELECT c, d FROM Doctrine\Tests\Models\Pagination\Company c JOIN c.departments d ORDER BY d.name'; + + $this->iterateWithOrderAscWithLimit(false, true, $dql, "name"); + $this->iterateWithOrderDescWithLimit(false, true, $dql, "name"); + } + + public function testCountWithCountSubqueryInWhereClauseWithOutputWalker() + { + $dql = "SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u WHERE ((SELECT COUNT(s.id) FROM Doctrine\Tests\Models\CMSCustomId\CmsUser s) = 9) ORDER BY u.id desc"; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query, true); + $paginator->setUseOutputWalkers(true); + $this->assertCount(9, $paginator); + } + + public function testIterateWithCountSubqueryInWhereClause() + { + $dql = "SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u WHERE ((SELECT COUNT(s.id) FROM Doctrine\Tests\Models\CMSCustomId\CmsUser s) = 9) ORDER BY u.id desc"; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query, true); + $paginator->setUseOutputWalkers(true); + + $users = iterator_to_array($paginator->getIterator()); + $this->assertCount(9, $users); + foreach ($users as $i => $user) { + $this->assertEquals("username" . (8 - $i), $user->username); + } + } + + public function testDetectOutputWalker() + { + // This query works using the output walkers but causes an exception using the TreeWalker + $dql = 'SELECT g, COUNT(u.id) AS userCount FROM Doctrine\Tests\Models\CMSCustomId\CmsGroup g LEFT JOIN g.users u GROUP BY g HAVING COUNT(u.id) > 0'; + $query = $this->_em->createQuery($dql); + + // If the Paginator detects the custom output walker it should fall back to using the + // Tree walkers for pagination, which leads to an exception. If the query works, the output walkers were used + $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, Query\SqlWalker::class); + $paginator = new Paginator($query); + + $this->expectException(\RuntimeException::class); + $this->expectExceptionMessage('Cannot count query that uses a HAVING clause. Use the output walkers for pagination'); + + count($paginator); + } + + /** + * Test using a paginator when the entity attribute name and corresponding column name are not the same. + */ + public function testPaginationWithColumnAttributeNameDifference() + { + $dql = 'SELECT c FROM Doctrine\Tests\Models\Pagination\Company c ORDER BY c.id'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->getIterator(); + + $this->assertCount(9, $paginator->getIterator()); + } + + public function testCloneQuery() + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u'; + $query = $this->_em->createQuery($dql); + + $paginator = new Paginator($query); + $paginator->getIterator(); + + $this->assertTrue($query->getParameters()->isEmpty()); + } + + public function testQueryWalkerIsKept() + { + $dql = 'SELECT u FROM Doctrine\Tests\Models\CMSCustomId\CmsUser u'; + $query = $this->_em->createQuery($dql); + $query->setHint(Query::HINT_CUSTOM_TREE_WALKERS, [CustomPaginationTestTreeWalker::class]); + + $paginator = new Paginator($query, true); + $paginator->setUseOutputWalkers(false); + $this->assertCount(1, $paginator->getIterator()); + $this->assertEquals(1, $paginator->count()); + } + + public function testCountQueryStripsParametersInSelect() + { + $query = $this->_em->createQuery( + 'SELECT u, (CASE WHEN u.id < :vipMaxId THEN 1 ELSE 0 END) AS hidden promotedFirst + FROM Doctrine\\Tests\\Models\\CMSCustomId\\CmsUser u + WHERE u.id < :id or 1=1' + ); + $query->setParameter('vipMaxId', 10); + $query->setParameter('id', 100); + $query->setFirstResult(null)->setMaxResults(null); + + $paginator = new Paginator($query); + + $getCountQuery = new ReflectionMethod($paginator, 'getCountQuery'); + + $getCountQuery->setAccessible(true); + + $this->assertCount(2, $getCountQuery->invoke($paginator)->getParameters()); + $this->assertCount(9, $paginator); + + $query->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, Query\SqlWalker::class); + + $paginator = new Paginator($query); + + // if select part of query is replaced with count(...) paginator should remove + // parameters from query object not used in new query. + $this->assertCount(1, $getCountQuery->invoke($paginator)->getParameters()); + $this->assertCount(9, $paginator); + } + + /** + * @dataProvider useOutputWalkersAndFetchJoinCollection + */ + public function testPaginationWithSubSelectOrderByExpression($useOutputWalker, $fetchJoinCollection) + { + $query = $this->_em->createQuery( + "SELECT u, + ( + SELECT MAX(a.version) + FROM Doctrine\\Tests\\Models\\CMSCustomId\\CmsArticle a + WHERE a.user = u + ) AS HIDDEN max_version + FROM Doctrine\\Tests\\Models\\CMSCustomId\\CmsUser u + ORDER BY max_version DESC" + ); + + $paginator = new Paginator($query, $fetchJoinCollection); + $paginator->setUseOutputWalkers($useOutputWalker); + + $this->assertCount(9, $paginator->getIterator()); + } + + public function populate() + { + $groups = []; + for ($j = 0; $j < 3; $j++) {; + $group = new CmsGroup(); + $group->id = new CustomIdObject('group' . $j); + $group->name = "group$j"; + $groups[] = $group; + $this->_em->persist($group); + } + + for ($i = 0; $i < 9; $i++) { + $email = new CmsEmail(); + $email->id = new CustomIdObject('email' . $i); + + $user = new CmsUser(); + $user->id = new CustomIdObject('user' . $i); + $user->name = "Name$i"; + $user->username = "username$i"; + $user->status = "active"; + $user->email = $email; + $user->email->user = $user; + $user->email->email = "email$i"; + for ($j = 0; $j < 3; $j++) { + $user->addGroup($groups[$j]); + } + $this->_em->persist($user); + for ($j = 0; $j < $i + 1; $j++) { + $article = new CmsArticle(); + $article->id = new CustomIdObject('article' . $j . "_user" . $i); + $article->topic = "topic$i$j"; + $article->text = "text$i$j"; + $article->setAuthor($user); + $article->version = 0; + $this->_em->persist($article); + } + } + + for ($i = 0; $i < 9; $i++) { + $company = new Company(); + $company->name = "name$i"; + $company->logo = new Logo(); + $company->logo->image = "image$i"; + $company->logo->image_width = 100 + $i; + $company->logo->image_height = 100 + $i; + $company->logo->company = $company; + for($j=0;$j<3;$j++) { + $department = new Department(); + $department->name = "name$i$j"; + $department->company = $company; + $company->departments[] = $department; + } + $this->_em->persist($company); + } + + for ($i = 0; $i < 9; $i++) { + $user = new User1(); + $user->name = "name$i"; + $user->email = "email$i"; + $this->_em->persist($user); + } + + $manager = new CompanyManager(); + $manager->setName('Roman B.'); + $manager->setTitle('Foo'); + $manager->setDepartment('IT'); + $manager->setSalary(100000); + + $this->_em->persist($manager); + + $this->_em->flush(); + } + + public function useOutputWalkers() + { + return [ + [true], + [false], + ]; + } + + public function fetchJoinCollection() + { + return [ + [true], + [false], + ]; + } + + public function useOutputWalkersAndFetchJoinCollection() + { + return [ + [true, false], + [true, true], + [false, false], + [false, true], + ]; + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/OrmFunctionalTestCase.php b/tests/Doctrine/Tests/OrmFunctionalTestCase.php index d45ebac6387..17eda7f55a1 100644 --- a/tests/Doctrine/Tests/OrmFunctionalTestCase.php +++ b/tests/Doctrine/Tests/OrmFunctionalTestCase.php @@ -107,6 +107,16 @@ abstract class OrmFunctionalTestCase extends OrmTestCase Models\CMS\CmsArticle::class, Models\CMS\CmsComment::class, ], + 'cmscustomid' => [ + Models\CMSCustomId\CmsUser::class, + Models\CMSCustomId\CmsPhonenumber::class, + Models\CMSCustomId\CmsAddress::class, + Models\CMSCustomId\CmsEmail::class, + Models\CMSCustomId\CmsGroup::class, + Models\CMSCustomId\CmsTag::class, + Models\CMSCustomId\CmsArticle::class, + Models\CMSCustomId\CmsComment::class, + ], 'company' => [ Models\Company\CompanyPerson::class, Models\Company\CompanyEmployee::class, @@ -356,6 +366,19 @@ protected function tearDown() $conn->executeUpdate('DELETE FROM cms_emails'); } + if (isset($this->_usedModelSets['cmscustomid'])) { + $conn->executeUpdate('DELETE FROM cms_users_groups_customid'); + $conn->executeUpdate('DELETE FROM cms_groups_customid'); + $conn->executeUpdate('DELETE FROM cms_users_tags_customid'); + $conn->executeUpdate('DELETE FROM cms_tags_customid'); + $conn->executeUpdate('DELETE FROM cms_addresses_customid'); + $conn->executeUpdate('DELETE FROM cms_phonenumbers_customid'); + $conn->executeUpdate('DELETE FROM cms_comments_customid'); + $conn->executeUpdate('DELETE FROM cms_articles_customid'); + $conn->executeUpdate('DELETE FROM cms_users_customid'); + $conn->executeUpdate('DELETE FROM cms_emails_customid'); + } + if (isset($this->_usedModelSets['ecommerce'])) { $conn->executeUpdate('DELETE FROM ecommerce_carts_products'); $conn->executeUpdate('DELETE FROM ecommerce_products_categories');