Skip to content

Commit 6a4eecc

Browse files
committed
Unwrap nested groups when using andFilter/orFilter
1 parent badbf99 commit 6a4eecc

File tree

1 file changed

+20
-3
lines changed

1 file changed

+20
-3
lines changed

src/Query/Builder.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use LdapRecord\Query\Filter\AndGroup;
1818
use LdapRecord\Query\Filter\Factory;
1919
use LdapRecord\Query\Filter\Filter;
20+
use LdapRecord\Query\Filter\GroupFilter;
2021
use LdapRecord\Query\Filter\Not;
2122
use LdapRecord\Query\Filter\OrGroup;
2223
use LdapRecord\Query\Filter\Raw;
@@ -763,7 +764,11 @@ public function andFilter(Closure $closure): static
763764
$query = $this->newNestedInstance($closure);
764765

765766
if ($filter = $query->getFilter()) {
766-
$this->addFilter(new AndGroup($filter));
767+
$filters = $filter instanceof GroupFilter
768+
? $filter->getFilters()
769+
: [$filter];
770+
771+
$this->addFilter(new AndGroup(...$filters), wrap: false);
767772
}
768773

769774
return $this;
@@ -777,7 +782,11 @@ public function orFilter(Closure $closure): static
777782
$query = $this->newNestedInstance($closure);
778783

779784
if ($filter = $query->getFilter()) {
780-
$this->addFilter(new OrGroup($filter), 'or');
785+
$filters = $filter instanceof GroupFilter
786+
? $filter->getFilters()
787+
: [$filter];
788+
789+
$this->addFilter(new OrGroup(...$filters), wrap: false);
781790
}
782791

783792
return $this;
@@ -1146,14 +1155,22 @@ public function orWhereNotEndsWith(string $attribute, string $value): static
11461155
/**
11471156
* Add a filter to the query.
11481157
*/
1149-
public function addFilter(Filter $filter, string $boolean = 'and'): static
1158+
public function addFilter(Filter $filter, string $boolean = 'and', bool $wrap = true): static
11501159
{
11511160
if (is_null($this->filter)) {
11521161
$this->filter = $filter;
11531162

11541163
return $this;
11551164
}
11561165

1166+
if (! $wrap) {
1167+
$this->filter = $boolean === 'or'
1168+
? new OrGroup($this->filter, $filter)
1169+
: new AndGroup($this->filter, $filter);
1170+
1171+
return $this;
1172+
}
1173+
11571174
// Flatten same-type groups to avoid deeply nested structures.
11581175
// Ex: AndGroup(AndGroup(a, b), c) becomes AndGroup(a, b, c)
11591176
if ($boolean === 'or') {

0 commit comments

Comments
 (0)