diff --git a/README.md b/README.md index 3eb2cd7..9affa5e 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ be used together with ``limit`` parameter. - `count` - will return record count. - `soft_deleted` - will include soft deleted models in search results. - `doesnt_have_relations` - will only return entries that don't have any of the specified relations. +- `use_raw_arguments` - will use raw SQL for group_by (groupByRaw) & returns (selectRaw) ### Search @@ -116,6 +117,23 @@ case-insensitive search. Will perform a ``SELECT * FROM some_table WHERE first_name LIKE 'foo' AND last_name NOT LIKE 'bar'``. +Example with raw query +{ + "search": { + ... + }, + "group_by": ["year", "month"], + "order_by": ["year", "month"], + "returns": ["DATE_PART('Year', created_at) AS year", "DATE_PART('Month', created_at) AS month", "COUNT(*) AS total"], + "use_raw_arguments": 1 +} + +Will perform: +``select DATE_PART(\'Year\', created_at) AS year, DATE_PART(\'Month\', created_at) AS month, COUNT(*) AS total +from .... +group by year, month order by "year" asc, "month" asc`` + + #### Micro operators - `!` - negates the value. Works only on the beginning of the value (i.e. `!value`). diff --git a/src/JsonQuery.php b/src/JsonQuery.php index deeacd2..9a7fb6b 100644 --- a/src/JsonQuery.php +++ b/src/JsonQuery.php @@ -65,13 +65,18 @@ public function search(): void */ protected function appendParameterQueries(): void { + // enable raw arguments + // will use raw method rather then basic ones, in group_by and returns + // $builder->selectRaw, $builder->groupByRaw + $rawArguments = boolval($this->input['use_raw_arguments'] ?? false) ?? false; + foreach ($this->registeredParameters as $requestParameter) { if (!$this->parameterExists($requestParameter)) { // TODO: append config query? continue; } - $this->instantiateRequestParameter($requestParameter) + $this->instantiateRequestParameter($requestParameter, $rawArguments) ->run(); } } @@ -97,12 +102,13 @@ protected function parameterExists(string $requestParameter): bool } /** - * @param $requestParameter + * @param string $requestParameter + * @param bool|null $rawArguments * @return AbstractParameter * * @throws JsonQueryBuilderException */ - protected function instantiateRequestParameter(string $requestParameter): AbstractParameter + protected function instantiateRequestParameter(string $requestParameter, ?bool $rawArguments = false): AbstractParameter { if (!is_subclass_of($requestParameter, AbstractParameter::class)) { throw new JsonQueryBuilderException("$requestParameter must extend " . AbstractParameter::class); @@ -110,7 +116,7 @@ protected function instantiateRequestParameter(string $requestParameter): Abstra $input = $this->wrapInput($requestParameter::getParameterName()); - return new $requestParameter($input, $this->builder, $this->modelConfig); + return new $requestParameter($input, $this->builder, $this->modelConfig, $rawArguments); } /** diff --git a/src/RequestParameters/AbstractParameter.php b/src/RequestParameters/AbstractParameter.php index eccd951..c6e7cc1 100644 --- a/src/RequestParameters/AbstractParameter.php +++ b/src/RequestParameters/AbstractParameter.php @@ -13,6 +13,7 @@ abstract class AbstractParameter public Builder $builder; public ModelConfig $modelConfig; protected array $arguments; + protected bool $rawArguments; /** * AbstractParameter constructor. @@ -20,12 +21,14 @@ abstract class AbstractParameter * @param array $arguments * @param Builder $builder * @param ModelConfig $modelConfig + * @param bool|null $rawArguents */ - public function __construct(array $arguments, Builder $builder, ModelConfig $modelConfig) + public function __construct(array $arguments, Builder $builder, ModelConfig $modelConfig, ?bool $rawArguments = false) { $this->arguments = $arguments; $this->builder = $builder; $this->modelConfig = $modelConfig; + $this->rawArguments = $rawArguments; } /** diff --git a/src/RequestParameters/GroupByParameter.php b/src/RequestParameters/GroupByParameter.php index 1214347..9d5f6e8 100644 --- a/src/RequestParameters/GroupByParameter.php +++ b/src/RequestParameters/GroupByParameter.php @@ -13,6 +13,12 @@ public static function getParameterName(): string protected function appendQuery(): void { - $this->builder->groupBy($this->arguments); + if (!$this->rawArguments) { + $this->builder->groupBy($this->arguments); + } else { + foreach ($this->arguments as $arg) { + $this->builder->groupByRaw($arg); + } + } } } diff --git a/src/RequestParameters/ReturnsParameter.php b/src/RequestParameters/ReturnsParameter.php index 907e62a..191c5d4 100644 --- a/src/RequestParameters/ReturnsParameter.php +++ b/src/RequestParameters/ReturnsParameter.php @@ -13,6 +13,12 @@ public static function getParameterName(): string protected function appendQuery(): void { - $this->builder->addSelect($this->arguments); + if (!$this->rawArguments) { + $this->builder->addSelect($this->arguments); + } else { + foreach ($this->arguments as $arg) { + $this->builder->selectRaw($arg); + } + } } }