Skip to content

Commit

Permalink
Merge pull request #39 from ConductionNL/development
Browse files Browse the repository at this point in the history
Fix for filtering on multiple values in an array
  • Loading branch information
rjzondervan authored Oct 22, 2024
2 parents 1917c12 + e8da4c3 commit 8405611
Showing 1 changed file with 30 additions and 2 deletions.
32 changes: 30 additions & 2 deletions lib/Service/MySQLJsonService.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,13 @@ public function searchJson(IQueryBuilder $builder, ?string $search = null): IQue
}

/**
* @inheritDoc
* Add complex filters to the filter set.
*
* @param IQueryBuilder $builder The query builder
* @param string $filter The filtered field.
* @param array $values The values to filter on.
*
* @return IQueryBuilder The updated query builder.
*/
private function jsonFilterArray(IQueryBuilder $builder, string $filter, array $values): IQueryBuilder
{
Expand Down Expand Up @@ -65,6 +71,27 @@ private function jsonFilterArray(IQueryBuilder $builder, string $filter, array $
return $builder;
}

/**
* Build a string to search multiple values in an array.
*
* @param array $values The values to search for.
* @param string $filter The field to filter on.
* @param IQueryBuilder $builder The query builder.
*
* @return string The resulting query string.
*/
private function getMultipleContains (array $values, string $filter, IQueryBuilder $builder): string
{
$orString = '';
foreach($values as $key=>$value)
{
$builder->createNamedParameter(value: $value, type: IQueryBuilder::PARAM_STR, placeHolder: ":value$filter$key");
$orString .= " OR json_contains(object, json_quote(:value$filter$key), :path$filter)";
}

return $orString;
}

/**
* @inheritDoc
*/
Expand All @@ -80,9 +107,10 @@ public function filterJson(IQueryBuilder $builder, array $filters): IQueryBuilde
$builder = $this->jsonFilterArray(builder: $builder, filter: $filter, values: $value);
continue;
} else if (is_array($value) === true) {

$builder->createNamedParameter(value: $value, type: IQueryBuilder::PARAM_STR_ARRAY, placeHolder: ":value$filter");
$builder
->andWhere("json_unquote(json_extract(object, :path$filter)) IN (:value$filter)");
->andWhere("(json_unquote(json_extract(object, :path$filter)) IN (:value$filter))". $this->getMultipleContains($value, $filter, $builder));
continue;
}

Expand Down

0 comments on commit 8405611

Please sign in to comment.