edd5d14b06
A CountSqlWalker and LimitSubquerySqlWalker have been implemented. By default the Paginator will use these SQL walkers. When a query already uses custom SQL walkers, the Paginator will fall back to the existing TreeWalker implementations. Improvements: * Support for more complex DQL queries using named mixed results with GROUP BY and HAVING. For example: SELECT g, u, COUNT(u.id) AS userCount FROM Entity\Group g LEFT JOIN g.users u GROUP BY g.id HAVING userCount > 0 * Support for entities with composite primary keys in the CountSqlWalker and LimitSubquerySqlWalker. Only the WhereInWalker still needs to be updated for full composite primary key support. But someone smarter than me needs to look at that and figure out how to build a WHERE IN query that can select rows based on multiple columns.
34 lines
1.5 KiB
PHP
34 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace Doctrine\Tests\ORM\Tools\Pagination;
|
|
|
|
use Doctrine\ORM\Query;
|
|
|
|
class LimitSubquerySqlWalkerTest extends PaginationTestCase
|
|
{
|
|
public function testLimitSubquery()
|
|
{
|
|
$query = $this->entityManager->createQuery(
|
|
'SELECT p, c, a FROM Doctrine\Tests\ORM\Tools\Pagination\MyBlogPost p JOIN p.category c JOIN p.author a');
|
|
$limitQuery = clone $query;
|
|
$limitQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\LimitSubquerySqlWalker');
|
|
|
|
$this->assertEquals(
|
|
"SELECT DISTINCT id0 FROM (SELECT m0_.id AS id0, c1_.id AS id1, a2_.id AS id2, a2_.name AS name3, m0_.author_id AS author_id4, m0_.category_id AS category_id5 FROM MyBlogPost m0_ INNER JOIN Category c1_ ON m0_.category_id = c1_.id INNER JOIN Author a2_ ON m0_.author_id = a2_.id) AS _dctrn_result", $limitQuery->getSql()
|
|
);
|
|
}
|
|
|
|
public function testCountQuery_MixedResultsWithName()
|
|
{
|
|
$query = $this->entityManager->createQuery(
|
|
'SELECT a, sum(a.name) as foo FROM Doctrine\Tests\ORM\Tools\Pagination\Author a');
|
|
$limitQuery = clone $query;
|
|
$limitQuery->setHint(Query::HINT_CUSTOM_OUTPUT_WALKER, 'Doctrine\ORM\Tools\Pagination\LimitSubquerySqlWalker');
|
|
|
|
$this->assertEquals(
|
|
"SELECT DISTINCT id0 FROM (SELECT a0_.id AS id0, a0_.name AS name1, sum(a0_.name) AS sclr2 FROM Author a0_) AS _dctrn_result", $limitQuery->getSql()
|
|
);
|
|
}
|
|
}
|
|
|