6
6
7
7
use Asseco \JsonQueryBuilder \Config \OperatorsConfig ;
8
8
use Asseco \JsonQueryBuilder \Exceptions \JsonQueryBuilderException ;
9
+ use Asseco \JsonQueryBuilder \JsonQuery ;
9
10
use Asseco \JsonQueryBuilder \SearchCallbacks \AbstractCallback ;
10
11
use Asseco \JsonQueryBuilder \SearchParser ;
11
12
use Illuminate \Database \Eloquent \Builder ;
13
+ use Illuminate \Support \Str ;
12
14
13
15
class SearchParameter extends AbstractParameter
14
16
{
@@ -31,6 +33,7 @@ public static function getParameterName(): string
31
33
protected function appendQuery (): void
32
34
{
33
35
$ arguments = $ this ->arguments ;
36
+
34
37
$ this ->operatorsConfig = new OperatorsConfig ();
35
38
36
39
// Wrapped within a where clause to protect from orWhere "exploits".
@@ -50,27 +53,35 @@ protected function appendQuery(): void
50
53
protected function makeQuery (Builder $ builder , array $ arguments , string $ boolOperator = self :: AND ): void
51
54
{
52
55
foreach ($ arguments as $ key => $ value ) {
53
- if ($ this ->isBoolOperator ($ key )) {
54
- // Recursion for keys which are &&/||
56
+ if ($ this ->isTopLevelBoolOperator ($ key )) {
55
57
$ this ->makeQuery ($ builder , $ value , $ key );
56
58
continue ;
57
59
}
58
60
59
61
$ functionName = $ this ->getQueryFunctionName ($ boolOperator );
60
62
61
- if ($ this ->shouldSplitQueries ( $ value )) {
63
+ if ($ this ->queryInitiatedByTopLevelBool ( $ key , $ value )) {
62
64
$ builder ->{$ functionName }(function ($ queryBuilder ) use ($ value ) {
63
65
// Recursion for inner keys which are &&/||
64
66
$ this ->makeQuery ($ queryBuilder , $ value );
65
67
});
66
68
continue ;
67
69
}
68
70
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
+
69
80
$ this ->makeSingleQuery ($ functionName , $ builder , $ key , $ value );
70
81
}
71
82
}
72
83
73
- protected function isBoolOperator ($ key ): bool
84
+ protected function isTopLevelBoolOperator ($ key ): bool
74
85
{
75
86
return in_array ($ key , [self :: OR , self :: AND ], true );
76
87
}
@@ -91,9 +102,16 @@ protected function getQueryFunctionName(string $boolOperator): string
91
102
throw new JsonQueryBuilderException ('Invalid bool operator provided ' );
92
103
}
93
104
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
95
113
{
96
- return is_array ($ value );
114
+ return is_string ( $ key ) && is_array ($ value );
97
115
}
98
116
99
117
/**
0 commit comments