1717use LdapRecord \Query \Filter \AndGroup ;
1818use LdapRecord \Query \Filter \Factory ;
1919use LdapRecord \Query \Filter \Filter ;
20+ use LdapRecord \Query \Filter \GroupFilter ;
2021use LdapRecord \Query \Filter \Not ;
2122use LdapRecord \Query \Filter \OrGroup ;
2223use 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