Skip to content

Commit 60a9731

Browse files
authored
[Tree] [NestedSet] [ClosureTree] Allow sorting children by a ManyToOne relation (#2493)
1 parent 303d399 commit 60a9731

File tree

5 files changed

+43
-6
lines changed

5 files changed

+43
-6
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ a release.
1919

2020
## [Unreleased]
2121

22+
### Fixed
23+
- Tree: Allow sorting children by a ManyToOne relation (#2492)
24+
2225
## [3.8.0] - 2022-07-17
2326
### Added
2427
- Sluggable: Add support for `DateTimeImmutable` fields

src/Tree/Entity/Repository/ClosureTreeRepository.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,15 +152,15 @@ public function childrenQueryBuilder($node = null, $direct = false, $sortByField
152152
if ($sortByField) {
153153
if (is_array($sortByField)) {
154154
foreach ($sortByField as $key => $field) {
155-
$fieldDirection = strtolower(is_array($direction) ? ($direction[$key] ?? 'asc') : $direction);
156-
if ($meta->hasField($field) && in_array($fieldDirection, ['asc', 'desc'], true)) {
155+
$fieldDirection = is_array($direction) ? ($direction[$key] ?? 'asc') : $direction;
156+
if (($meta->hasField($field) || $meta->isSingleValuedAssociation($field)) && in_array(strtolower($fieldDirection), ['asc', 'desc'], true)) {
157157
$qb->addOrderBy('node.'.$field, $fieldDirection);
158158
} else {
159159
throw new InvalidArgumentException(sprintf('Invalid sort options specified: field - %s, direction - %s', $field, $fieldDirection));
160160
}
161161
}
162162
} else {
163-
if ($meta->hasField($sortByField) && in_array(strtolower($direction), ['asc', 'desc'], true)) {
163+
if (($meta->hasField($sortByField) || $meta->isSingleValuedAssociation($sortByField)) && in_array(strtolower($direction), ['asc', 'desc'], true)) {
164164
$qb->orderBy('node.'.$sortByField, $direction);
165165
} else {
166166
throw new InvalidArgumentException(sprintf('Invalid sort options specified: field - %s, direction - %s', $sortByField, $direction));

src/Tree/Entity/Repository/NestedTreeRepository.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,15 +248,15 @@ public function childrenQueryBuilder($node = null, $direct = false, $sortByField
248248
$qb->orderBy('node.'.$config['left'], 'ASC');
249249
} elseif (is_array($sortByField)) {
250250
foreach ($sortByField as $key => $field) {
251-
$fieldDirection = strtolower(is_array($direction) ? ($direction[$key] ?? 'asc') : $direction);
252-
if ($meta->hasField($field) && in_array($fieldDirection, ['asc', 'desc'], true)) {
251+
$fieldDirection = is_array($direction) ? ($direction[$key] ?? 'asc') : $direction;
252+
if (($meta->hasField($field) || $meta->isSingleValuedAssociation($field)) && in_array(strtolower($fieldDirection), ['asc', 'desc'], true)) {
253253
$qb->addOrderBy('node.'.$field, $fieldDirection);
254254
} else {
255255
throw new InvalidArgumentException(sprintf('Invalid sort options specified: field - %s, direction - %s', $field, $fieldDirection));
256256
}
257257
}
258258
} else {
259-
if ($meta->hasField($sortByField) && in_array(strtolower($direction), ['asc', 'desc'], true)) {
259+
if (($meta->hasField($sortByField) || $meta->isSingleValuedAssociation($sortByField)) && in_array(strtolower($direction), ['asc', 'desc'], true)) {
260260
$qb->orderBy('node.'.$sortByField, $direction);
261261
} else {
262262
throw new InvalidArgumentException(sprintf('Invalid sort options specified: field - %s, direction - %s', $sortByField, $direction));

tests/Gedmo/Tree/ClosureTreeRepositoryTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,21 @@ public function testChildren(): void
165165
static::assertSame('Oranges', $children[3]->getTitle());
166166
static::assertSame('Strawberries', $children[4]->getTitle());
167167

168+
// test sorting by single-valued association field
169+
$children = $repo->children($fruits, false, 'parent');
170+
static::assertCount(4, $children);
171+
static::assertSame('Oranges', $children[0]->getTitle());
172+
static::assertSame('Lemons', $children[1]->getTitle());
173+
static::assertSame('Berries', $children[2]->getTitle());
174+
static::assertSame('Strawberries', $children[3]->getTitle());
175+
176+
$children = $repo->children($fruits, false, ['parent'], ['ASC']);
177+
static::assertCount(4, $children);
178+
static::assertSame('Oranges', $children[0]->getTitle());
179+
static::assertSame('Lemons', $children[1]->getTitle());
180+
static::assertSame('Berries', $children[2]->getTitle());
181+
static::assertSame('Strawberries', $children[3]->getTitle());
182+
168183
// direct root nodes
169184
$children = $repo->children(null, true, 'title');
170185
static::assertCount(2, $children);

tests/Gedmo/Tree/RepositoryTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,25 @@ public function testBasicFunctions(): void
121121
static::assertSame('Carrots', $children[2]->getTitle());
122122
static::assertSame('Potatoes', $children[3]->getTitle());
123123

124+
// test sorting by single-valued association field
125+
$children = $this->em->getRepository(self::CATEGORY)
126+
->children($food, false, 'parentId');
127+
128+
static::assertCount(4, $children);
129+
static::assertSame('Fruits', $children[0]->getTitle());
130+
static::assertSame('Vegitables', $children[1]->getTitle());
131+
static::assertSame('Carrots', $children[2]->getTitle());
132+
static::assertSame('Potatoes', $children[3]->getTitle());
133+
134+
$children = $this->em->getRepository(self::CATEGORY)
135+
->children($food, false, ['parentId'], ['ASC']);
136+
137+
static::assertCount(4, $children);
138+
static::assertSame('Fruits', $children[0]->getTitle());
139+
static::assertSame('Vegitables', $children[1]->getTitle());
140+
static::assertSame('Carrots', $children[2]->getTitle());
141+
static::assertSame('Potatoes', $children[3]->getTitle());
142+
124143
// path
125144

126145
$path = $this->em->getRepository(self::CATEGORY)

0 commit comments

Comments
 (0)