66
77use Asseco \JsonQueryBuilder \Config \OperatorsConfig ;
88use Asseco \JsonQueryBuilder \Exceptions \JsonQueryBuilderException ;
9+ use Asseco \JsonQueryBuilder \JsonQuery ;
910use Asseco \JsonQueryBuilder \SearchCallbacks \AbstractCallback ;
1011use Asseco \JsonQueryBuilder \SearchParser ;
1112use Illuminate \Database \Eloquent \Builder ;
13+ use Illuminate \Support \Str ;
1214
1315class SearchParameter extends AbstractParameter
1416{
@@ -31,6 +33,7 @@ public static function getParameterName(): string
3133 protected function appendQuery (): void
3234 {
3335 $ arguments = $ this ->arguments ;
36+
3437 $ this ->operatorsConfig = new OperatorsConfig ();
3538
3639 // Wrapped within a where clause to protect from orWhere "exploits".
@@ -50,27 +53,35 @@ protected function appendQuery(): void
5053 protected function makeQuery (Builder $ builder , array $ arguments , string $ boolOperator = self :: AND ): void
5154 {
5255 foreach ($ arguments as $ key => $ value ) {
53- if ($ this ->isBoolOperator ($ key )) {
54- // Recursion for keys which are &&/||
56+ if ($ this ->isTopLevelBoolOperator ($ key )) {
5557 $ this ->makeQuery ($ builder , $ value , $ key );
5658 continue ;
5759 }
5860
5961 $ functionName = $ this ->getQueryFunctionName ($ boolOperator );
6062
61- if ($ this ->shouldSplitQueries ( $ value )) {
63+ if ($ this ->queryInitiatedByTopLevelBool ( $ key , $ value )) {
6264 $ builder ->{$ functionName }(function ($ queryBuilder ) use ($ value ) {
6365 // Recursion for inner keys which are &&/||
6466 $ this ->makeQuery ($ queryBuilder , $ value );
6567 });
6668 continue ;
6769 }
6870
71+ if ($ this ->hasSubSearch ($ key , $ value )) {
72+ // If query has sub-search, it is a relation for sure.
73+ $ builder ->whereHas (Str::camel ($ key ), function ($ query ) use ($ value ) {
74+ $ jsonQuery = new JsonQuery ($ query , $ value );
75+ $ jsonQuery ->search ();
76+ });
77+ continue ;
78+ }
79+
6980 $ this ->makeSingleQuery ($ functionName , $ builder , $ key , $ value );
7081 }
7182 }
7283
73- protected function isBoolOperator ($ key ): bool
84+ protected function isTopLevelBoolOperator ($ key ): bool
7485 {
7586 return in_array ($ key , [self :: OR , self :: AND ], true );
7687 }
@@ -91,9 +102,16 @@ protected function getQueryFunctionName(string $boolOperator): string
91102 throw new JsonQueryBuilderException ('Invalid bool operator provided ' );
92103 }
93104
94- protected function shouldSplitQueries ($ value ): bool
105+ protected function queryInitiatedByTopLevelBool ($ key , $ value ): bool
106+ {
107+ // Since this will be triggered by recursion, key will be numeric
108+ // and not the actual key.
109+ return !is_string ($ key ) && is_array ($ value );
110+ }
111+
112+ protected function hasSubSearch ($ key , $ value ): bool
95113 {
96- return is_array ($ value );
114+ return is_string ( $ key ) && is_array ($ value );
97115 }
98116
99117 /**
0 commit comments