99use Illuminate \Database \Eloquent \Relations \Relation ;
1010use Illuminate \Database \Eloquent \SoftDeletes ;
1111use Illuminate \Support \Arr ;
12+ use JsonException ;
1213use Orion \Http \Requests \Request ;
1314use RuntimeException ;
1415
@@ -62,6 +63,7 @@ public function __construct(
6263 * @param Builder|Relation $query
6364 * @param Request $request
6465 * @return Builder|Relation
66+ * @throws JsonException
6567 */
6668 public function buildQuery ($ query , Request $ request )
6769 {
@@ -102,6 +104,7 @@ public function applyScopesToQuery($query, Request $request): void
102104 * @param Builder|Relation $query
103105 * @param Request $request
104106 * @param array $filterDescriptors
107+ * @throws JsonException
105108 */
106109 public function applyFiltersToQuery ($ query , Request $ request , array $ filterDescriptors = []): void
107110 {
@@ -146,6 +149,7 @@ function ($relationQuery) use ($relationField, $filterDescriptor) {
146149 * @param Builder|Relation $query
147150 * @param bool $or
148151 * @return Builder|Relation
152+ * @throws JsonException
149153 */
150154 protected function buildFilterQueryWhereClause (string $ field , array $ filterDescriptor , $ query , bool $ or = false )
151155 {
@@ -168,6 +172,7 @@ protected function buildFilterQueryWhereClause(string $field, array $filterDescr
168172 * @param Builder|Relation $query
169173 * @param bool $or
170174 * @return Builder|Relation
175+ * @throws JsonException
171176 */
172177 protected function buildFilterNestedQueryWhereClause (
173178 string $ field ,
@@ -180,16 +185,36 @@ protected function buildFilterNestedQueryWhereClause(
180185
181186 if ($ treatAsDateField && Carbon::parse ($ filterDescriptor ['value ' ])->toTimeString () === '00:00:00 ' ) {
182187 $ constraint = 'whereDate ' ;
188+ } elseif (in_array (Arr::get ($ filterDescriptor , 'operator ' ), ['all in ' , 'any in ' ])) {
189+ $ constraint = 'whereJsonContains ' ;
183190 } else {
184191 $ constraint = 'where ' ;
185192 }
186193
187- if (!is_array ($ filterDescriptor ['value ' ]) || $ constraint === 'whereDate ' ) {
188- $ query ->{$ or ? 'or ' . ucfirst ($ constraint ) : $ constraint }(
194+ if ($ constraint !== 'whereJsonContains ' && (!is_array (
195+ $ filterDescriptor ['value ' ]
196+ ) || $ constraint === 'whereDate ' )) {
197+ $ query ->{$ or ? 'or ' .ucfirst ($ constraint ) : $ constraint }(
189198 $ field ,
190199 $ filterDescriptor ['operator ' ] ?? '= ' ,
191200 $ filterDescriptor ['value ' ]
192201 );
202+ } elseif ($ constraint === 'whereJsonContains ' ) {
203+ if (!is_array ($ filterDescriptor ['value ' ])) {
204+ $ query ->{$ or ? 'orWhereJsonContains ' : 'whereJsonContains ' }(
205+ $ field ,
206+ $ filterDescriptor ['value ' ]
207+ );
208+ } else {
209+ $ query ->{$ or ? 'orWhere ' : 'where ' }(function ($ nestedQuery ) use ($ filterDescriptor , $ field ) {
210+ foreach ($ filterDescriptor ['value ' ] as $ value ) {
211+ $ nestedQuery ->{$ filterDescriptor ['operator ' ] === 'any in ' ? 'orWhereJsonContains ' : 'whereJsonContains ' }(
212+ $ field ,
213+ $ value
214+ );
215+ }
216+ });
217+ }
193218 } else {
194219 $ query ->{$ or ? 'orWhereIn ' : 'whereIn ' }(
195220 $ field ,
@@ -335,14 +360,14 @@ function ($relationQuery) use ($relationField, $requestedSearchString, $caseSens
335360 if (!$ caseSensitive ) {
336361 return $ relationQuery ->whereRaw (
337362 "lower( {$ relationField }) like lower(?) " ,
338- ['% ' . $ requestedSearchString . '% ' ]
363+ ['% ' . $ requestedSearchString. '% ' ]
339364 );
340365 }
341366
342367 return $ relationQuery ->where (
343368 $ relationField ,
344369 'like ' ,
345- '% ' . $ requestedSearchString . '% '
370+ '% ' . $ requestedSearchString. '% '
346371 );
347372 }
348373 );
@@ -352,13 +377,13 @@ function ($relationQuery) use ($relationField, $requestedSearchString, $caseSens
352377 if (!$ caseSensitive ) {
353378 $ whereQuery ->orWhereRaw (
354379 "lower( {$ qualifiedFieldName }) like lower(?) " ,
355- ['% ' . $ requestedSearchString . '% ' ]
380+ ['% ' . $ requestedSearchString. '% ' ]
356381 );
357382 } else {
358383 $ whereQuery ->orWhere (
359384 $ qualifiedFieldName ,
360385 'like ' ,
361- '% ' . $ requestedSearchString . '% '
386+ '% ' . $ requestedSearchString. '% '
362387 );
363388 }
364389 }
0 commit comments