diff --git a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php index 9aba64c24cd07125e17db9ec7954ba2b1f6ed6cb..51810ae641ff08473eb2fe258b9a35174b972e31 100644 --- a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php +++ b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php @@ -954,9 +954,12 @@ class Typo3DbQueryParser $relationTableName = $columnMap->getRelationTableName(); $relationTableAlias = $relationTableAlias = $this->getUniqueAlias($relationTableName, $fullPropertyPath . '_mm'); - $joinConditionExpression = $this->queryBuilder->expr()->eq( - $tableName . '.uid', - $relationTableAlias . '.' . $columnMap->getParentKeyFieldName() + $joinConditionExpression = $this->queryBuilder->expr()->andX( + $this->queryBuilder->expr()->eq( + $tableName . '.uid', + $relationTableAlias . '.' . $columnMap->getParentKeyFieldName() + ), + $this->getAdditionalMatchFieldsStatement($this->queryBuilder->expr(), $columnMap, $relationTableAlias, $realTableName) ); $this->queryBuilder->leftJoin($tableName, $relationTableName, $relationTableAlias, $joinConditionExpression); $joinConditionExpression = $this->queryBuilder->expr()->eq( @@ -964,9 +967,6 @@ class Typo3DbQueryParser $childTableAlias . '.uid' ); $this->queryBuilder->leftJoin($relationTableAlias, $childTableName, $childTableAlias, $joinConditionExpression); - $this->queryBuilder->andWhere( - $this->getAdditionalMatchFieldsStatement($this->queryBuilder->expr(), $columnMap, $relationTableAlias, $realTableName) - ); $this->unionTableAliasCache[] = $childTableAlias; $this->queryBuilder->addGroupBy($this->tableName . '.uid'); } else { diff --git a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/PostRepository.php b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/PostRepository.php index 6ca57c01f3b216634cd3068bcafc72e3a4cf9e7d..f51a4e538391a638ec1d35f931264d38edebf251 100644 --- a/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/PostRepository.php +++ b/typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example/Classes/Domain/Repository/PostRepository.php @@ -14,6 +14,8 @@ namespace ExtbaseTeam\BlogExample\Domain\Repository; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Extbase\Persistence\QueryInterface; + /** * A repository for blog posts * @@ -148,4 +150,15 @@ class PostRepository extends \TYPO3\CMS\Extbase\Persistence\Repository ) ->execute(); } + + public function findAllSortedByCategory(array $uids) + { + $q = $this->createQuery(); + $q->matching($q->in('uid', $uids)); + $q->setOrderings([ + 'categories.title' => QueryInterface::ORDER_ASCENDING, + 'uid' => QueryInterface::ORDER_ASCENDING, + ]); + return $q->execute(); + } } diff --git a/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/category-mm.xml b/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/category-mm.xml index a92727532be02030a2b6b7b81e5369d89bd51ada..785e287813a85eae1292849ad918edb7ae541ef3 100644 --- a/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/category-mm.xml +++ b/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/category-mm.xml @@ -46,6 +46,16 @@ <sorting_foreign>2</sorting_foreign> </sys_category_record_mm> + <!-- some bogus records to test MM_match_fields --> + <sys_category_record_mm> + <uid_local>4</uid_local> + <uid_foreign>5</uid_foreign> + <tablenames>tx_my_extension</tablenames> + <fieldname>categories</fieldname> + <sorting>1</sorting> + <sorting_foreign>2</sorting_foreign> + </sys_category_record_mm> + <!-- blog 1 gets categories 1,2,3 --> <sys_category_record_mm> <uid_local>1</uid_local> diff --git a/typo3/sysext/extbase/Tests/Functional/Persistence/RelationTest.php b/typo3/sysext/extbase/Tests/Functional/Persistence/RelationTest.php index 6cc153d3123e85aad982ad8dd4c2d2a06dd494a6..09aefcd948103b4a7283a8086831af3e32c2e0ec 100644 --- a/typo3/sysext/extbase/Tests/Functional/Persistence/RelationTest.php +++ b/typo3/sysext/extbase/Tests/Functional/Persistence/RelationTest.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Extbase\Tests\Functional\Persistence; * The TYPO3 project - inspiring people to share! */ +use ExtbaseTeam\BlogExample\Domain\Model\Post; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -1009,4 +1010,42 @@ class RelationTest extends \TYPO3\TestingFramework\Core\Functional\FunctionalTes $blogRepository->update($this->blog); $this->persistentManager->persistAll(); } + + public function ensureCorrectPostOrderingByCategoryTitleDataProvider() + { + return [ + 'Post with no category and post with category' => [ + [2, 3], + [3, 2] + ], + 'Posts with category and Post with category and bogus category' => [ + [2, 1], + [1, 2] + ], + 'Posts bogus category and post with category' => [ + [5, 2], + [5, 2] + ], + ]; + } + + /** + * This test covers the case when data is ordered by criteria that is MM related with matchFields involved + * on the relation table. (post <-> sys_category_mm <-> sys_category) + * + * @test + * @dataProvider ensureCorrectPostOrderingByCategoryTitleDataProvider + */ + public function ensureCorrectPostOrderingByCategoryTitle(array $uids, array $expected) + { + /** @var \ExtbaseTeam\BlogExample\Domain\Repository\PostRepository $postRepository */ + $postRepository = $this->objectManager->get(\ExtbaseTeam\BlogExample\Domain\Repository\PostRepository::class); + $posts = $postRepository->findAllSortedByCategory($uids)->toArray(); + $result = []; + /** @var Post $post */ + foreach ($posts as $post) { + $result[] = $post->getUid(); + } + $this->assertSame($expected, $result); + } }