diff --git a/lib/Db/ObjectEntityMapper.php b/lib/Db/ObjectEntityMapper.php index dbe9c6a..83f5ad2 100644 --- a/lib/Db/ObjectEntityMapper.php +++ b/lib/Db/ObjectEntityMapper.php @@ -103,7 +103,7 @@ public function findByRegisterAndSchema(string $register, string $schema): Objec return $this->findEntities(query: $qb); } - public function countAll(?array $filters = [], ?array $searchConditions = [], ?array $searchParams = []): int + public function countAll(?array $filters = [], ?string $search = null): int { $qb = $this->db->getQueryBuilder(); @@ -119,19 +119,12 @@ public function countAll(?array $filters = [], ?array $searchConditions = [], ?a } } - if (!empty($searchConditions)) { - $qb->andWhere('(' . implode(' OR ', $searchConditions) . ')'); - foreach ($searchParams as $param => $value) { - $qb->setParameter($param, $value); - } - } $qb = $this->databaseJsonService->filterJson($qb, $filters); + $qb = $this->databaseJsonService->searchJson($qb, $search); $result = $qb->executeQuery(); - $count = $result->fetchAll()[0]['count']; - - return $count; + return $result->fetchAll()[0]['count']; } /** @@ -144,7 +137,7 @@ public function countAll(?array $filters = [], ?array $searchConditions = [], ?a * @param array $searchParams The search parameters to apply to the objects * @return array An array of ObjectEntitys */ - public function findAll(?int $limit = null, ?int $offset = null, ?array $filters = [], ?array $searchConditions = [], ?array $searchParams = [], array $sort = []): array + public function findAll(?int $limit = null, ?int $offset = null, ?array $filters = [], ?array $searchConditions = [], ?array $searchParams = [], array $sort = [], ?string $search = null): array { $qb = $this->db->getQueryBuilder(); @@ -171,8 +164,11 @@ public function findAll(?int $limit = null, ?int $offset = null, ?array $filters } $qb = $this->databaseJsonService->filterJson(builder: $qb, filters: $filters); + $qb = $this->databaseJsonService->searchJson(builder: $qb, search: $search); $qb = $this->databaseJsonService->orderJson(builder: $qb, order: $sort); +// var_dump($qb->getSQL()); + return $this->findEntities(query: $qb); } diff --git a/lib/Service/MySQLJsonService.php b/lib/Service/MySQLJsonService.php index 3a8e267..9282b9a 100644 --- a/lib/Service/MySQLJsonService.php +++ b/lib/Service/MySQLJsonService.php @@ -20,6 +20,16 @@ function orderJson(IQueryBuilder $builder, array $order = []): IQueryBuilder return $builder; } + function searchJson(IQueryBuilder $builder, ?string $search = null): IQueryBuilder + { + if($search !== null) { + $builder->createNamedParameter(value: "%$search%", placeHolder: ':search'); + $builder->andWhere("JSON_SEARCH(object, 'one', :search) IS NOT NULL"); + } + + return $builder; + } + function filterJson(IQueryBuilder $builder, array $filters): IQueryBuilder { unset($filters['register'], $filters['schema'], $filters['updated'], $filters['created'], $filters['_queries']); @@ -51,8 +61,10 @@ function filterJson(IQueryBuilder $builder, array $filters): IQueryBuilder $builder->createNamedParameter(value: $value, placeHolder: ":value$filter"); $builder - ->andWhere("json_extract(object, :path$filter) = :value$filter"); + ->andWhere("json_extract(object, :path$filter) = :value$filter OR json_contains(object, json_quote(:value$filter), :path$filter)"); } +// var_dump($builder->getSQL()); + return $builder; } diff --git a/lib/Service/ObjectService.php b/lib/Service/ObjectService.php index 11f021c..5665f43 100755 --- a/lib/Service/ObjectService.php +++ b/lib/Service/ObjectService.php @@ -79,7 +79,7 @@ public function delete(array|\JsonSerializable $object): bool ); } - public function findAll(?int $limit = null, ?int $offset = null, array $filters = [], array $sort = []): array + public function findAll(?int $limit = null, ?int $offset = null, array $filters = [], array $sort = [], ?string $search = null): array { $objects = $this->getObjects( register: $this->getRegister(), @@ -87,21 +87,22 @@ public function findAll(?int $limit = null, ?int $offset = null, array $filters limit: $limit, offset: $offset, filters: $filters, - sort: $sort + sort: $sort, + search: $search ); // $data = array_map([$this, 'getDataFromObject'], $objects); return $objects; } - public function count(array $filters = []): int + public function count(array $filters = [], ?string $search = null): int { if($this->getSchema() !== null && $this->getRegister() !== null) { $filters['register'] = $this->getRegister(); $filters['schema'] = $this->getSchema(); } $count = $this->objectEntityMapper - ->countAll(filters: $filters); + ->countAll(filters: $filters, search: $search); return $count; } @@ -148,7 +149,7 @@ private function getDataFromObject(mixed $object) { * @return array The retrieved objects. * @throws \Exception */ - public function getObjects(?string $objectType = null, ?int $register = null, ?int $schema = null, ?int $limit = null, ?int $offset = null, array $filters = [], array $sort = []): array + public function getObjects(?string $objectType = null, ?int $register = null, ?int $schema = null, ?int $limit = null, ?int $offset = null, array $filters = [], array $sort = [], ?string $search = null): array { if($objectType === null && $register !== null && $schema !== null) { $objectType = 'objectEntity'; @@ -160,7 +161,7 @@ public function getObjects(?string $objectType = null, ?int $register = null, ?i $mapper = $this->getMapper($objectType); // Use the mapper to find and return all objects of the specified type - return $mapper->findAll(limit: $limit, offset: $offset, filters: $filters, sort: $sort); + return $mapper->findAll(limit: $limit, offset: $offset, filters: $filters, sort: $sort, search: $search); } /**