From 19a6c1574b4654f2fa68c9af953e2fa777de5e9c Mon Sep 17 00:00:00 2001 From: iqbalatma Date: Tue, 19 Dec 2023 14:11:45 +0700 Subject: [PATCH 1/4] fixing where clause on string into mixed, select into addSelect, and perPage with key customization --- src/Config/queryextend.php | 5 +- .../Abstracts/BaseQueryBuilderExtend.php | 48 +++++++++++-------- src/Traits/QueryExtend.php | 3 +- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/Config/queryextend.php b/src/Config/queryextend.php index d43893d..08a754c 100644 --- a/src/Config/queryextend.php +++ b/src/Config/queryextend.php @@ -10,7 +10,10 @@ | per page is 10 | */ - "perpage" => 15, + "perpage" =>[ + "key" => "perpage", + "value" => 15, + ], /* |-------------------------------------------------------------------------- diff --git a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php index ab9d321..f165377 100644 --- a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php +++ b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php @@ -217,11 +217,11 @@ public function orWhereHas(string $relation, Closure|null $callback = null, stri /** * @param array|string $column * @param string|null $operator - * @param string|null $value + * @param mixed $value * @param string|null $boolean * @return BaseQueryBuilder */ - public function where(array|string $column, ?string $operator = null, ?string $value = null, ?string $boolean = 'and'): BaseQueryBuilder + public function where(array|string $column, ?string $operator = null, mixed $value = null, ?string $boolean = 'and'): BaseQueryBuilder { $this->builder->where($column, $operator, $value, $boolean); return $this->baseQueryBuilder; @@ -231,10 +231,10 @@ public function where(array|string $column, ?string $operator = null, ?string $v /** * @param array|string $column * @param string|null $operator - * @param string|null $value + * @param mixed $value * @return BaseQueryBuilder */ - public function orWhere(array|string $column, ?string $operator = null, ?string $value = null): BaseQueryBuilder + public function orWhere(array|string $column, ?string $operator = null, mixed $value = null): BaseQueryBuilder { $this->builder->orWhere($column, $operator, $value); return $this->baseQueryBuilder; @@ -244,11 +244,11 @@ public function orWhere(array|string $column, ?string $operator = null, ?string /** * @param $column * @param string|null $operator - * @param string|null $value + * @param mixed $value * @param string|null $boolean * @return BaseQueryBuilder */ - public function whereNot($column, ?string $operator = null, ?string $value = null, ?string $boolean = 'and'): BaseQueryBuilder + public function whereNot($column, ?string $operator = null, mixed $value = null, ?string $boolean = 'and'): BaseQueryBuilder { $this->builder->whereNot($column, $operator, $value, $boolean); return $this->baseQueryBuilder; @@ -271,11 +271,11 @@ public function whereBetween(string $column, array $values, string $boolean = 'a /** * @param string $column - * @param array|string $values + * @param iterable $values * @param string $boolean * @return BaseQueryBuilder */ - public function whereNotBetween(string $column, array|string $values, string $boolean = 'and'): BaseQueryBuilder + public function whereNotBetween(string $column, iterable $values, string $boolean = 'and'): BaseQueryBuilder { $this->builder->whereNotBetween($column, $values, $boolean); return $this->baseQueryBuilder; @@ -457,26 +457,31 @@ public function orWhereColumn(array|string $first, ?string $operator = null, ?st * @param int|null $perPage * @return LengthAwarePaginator */ - public function getAllDataPaginated(array $whereClause = [], array $columns = ["*"], ?int $perPage = null):LengthAwarePaginator + public function getAllDataPaginated(array $whereClause = [], array|null $columns = null, ?int $perPage = null):LengthAwarePaginator { if (!$perPage) { - $perPage = request()->query("perpage", config('queryextend.perpage')); + $perPage = request()->query(config("queryextend.perpage.key"), config('queryextend.perpage.value')); + } + + if ($columns){ + $this->builder->addSelect($columns); } return $this->builder - ->select($columns) ->where($whereClause) ->paginate($perPage); } /** * @param array $whereClause - * @param array $columns + * @param array|null $columns * @return Builder[]|Collection */ - public function getAllData(array $whereClause = [], array $columns = ["*"]): Collection|array + public function getAllData(array $whereClause = [], array|null $columns = null): Collection|array { + if ($columns){ + $this->builder->addSelect($columns); + } return $this->builder - ->select($columns) ->where($whereClause) ->get(); } @@ -486,20 +491,25 @@ public function getAllData(array $whereClause = [], array $columns = ["*"]): Col * @param array $columns * @return Builder|Builder[]|Collection|Model|null */ - public function getDataById(string|int|array $id, array $columns = ["*"]) + public function getDataById(string|int|array $id, array|null $columns = null) { - return $this->builder->select($columns)->find($id); + if ($columns){ + $this->builder->addSelect($columns); + } + return $this->builder->find($id); } /** * @param array $whereClause - * @param array $columns + * @param array|null $columns * @return Builder|Model|object|null */ - public function getSingleData(array $whereClause = [], array $columns = ["*"]) + public function getSingleData(array $whereClause = [], array|null $columns = null) { + if ($columns){ + $this->builder->addSelect($columns); + } return $this->builder - ->select($columns) ->where($whereClause) ->first(); } diff --git a/src/Traits/QueryExtend.php b/src/Traits/QueryExtend.php index 4d6a619..c92b66a 100644 --- a/src/Traits/QueryExtend.php +++ b/src/Traits/QueryExtend.php @@ -5,6 +5,7 @@ use Classid\LaravelServiceQueryBuilderExtend\Contracts\Abstracts\BaseQueryBuilder; use Classid\LaravelServiceQueryBuilderExtend\Contracts\Abstracts\BaseQueryBuilderExtend; use Exception; +use RuntimeException; trait QueryExtend { @@ -42,7 +43,7 @@ public function __call($name, $arguments) public function overload(string $name, array $arguments): mixed { if (!property_exists($this, 'builder')) { - throw new Exception("Property 'builder' does not exist or is not initialized."); + throw new RuntimeException("Property 'builder' does not exist or is not initialized."); } if (method_exists(new BaseQueryBuilderExtend($this), $name)) { From f4d5bc96894377af4c3e793be4f9e48f8d878416 Mon Sep 17 00:00:00 2001 From: iqbalatma Date: Tue, 19 Dec 2023 14:14:50 +0700 Subject: [PATCH 2/4] add return type on query --- .../Abstracts/BaseQueryBuilderExtend.php | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php index f165377..33a00d7 100644 --- a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php +++ b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php @@ -453,7 +453,7 @@ public function orWhereColumn(array|string $first, ?string $operator = null, ?st /** * @param array $whereClause - * @param array $columns + * @param array|null $columns * @param int|null $perPage * @return LengthAwarePaginator */ @@ -488,10 +488,10 @@ public function getAllData(array $whereClause = [], array|null $columns = null): /** * @param string|int|array $id - * @param array $columns + * @param array|null $columns * @return Builder|Builder[]|Collection|Model|null */ - public function getDataById(string|int|array $id, array|null $columns = null) + public function getDataById(string|int|array $id, array|null $columns = null): Model|Collection|Builder|array|null { if ($columns){ $this->builder->addSelect($columns); @@ -502,9 +502,9 @@ public function getDataById(string|int|array $id, array|null $columns = null) /** * @param array $whereClause * @param array|null $columns - * @return Builder|Model|object|null + * @return Builder|Model|null */ - public function getSingleData(array $whereClause = [], array|null $columns = null) + public function getSingleData(array $whereClause = [], array|null $columns = null): Model|Builder|null { if ($columns){ $this->builder->addSelect($columns); @@ -518,7 +518,7 @@ public function getSingleData(array $whereClause = [], array|null $columns = nul * @param array $requestedData * @return Builder|Model */ - public function addNewData(array $requestedData) + public function addNewData(array $requestedData): Model|Builder { return $this->builder->create($requestedData); } @@ -541,7 +541,7 @@ public function addMultipleData(array $requestedData): int * @param bool $isReturnObject * @return Builder|Builder[]|Collection|Model|int|null */ - public function updateDataById(string|int $id, array $requestedData, array $columns = ["*"], bool $isReturnObject = true) + public function updateDataById(string|int $id, array $requestedData, array $columns = ["*"], bool $isReturnObject = true): Model|Collection|Builder|int|array|null { $updatedData = $this->builder ->where("id", $id) @@ -557,9 +557,9 @@ public function updateDataById(string|int $id, array $requestedData, array $colu * @param array $requestedData * @param array $columns * @param bool $isReturnObject - * @return Collection|int|null + * @return Collection|int|array|null */ - public function updateDataByWhereClause(array $whereClause, array $requestedData, array $columns = ["*"], bool $isReturnObject = false) + public function updateDataByWhereClause(array $whereClause, array $requestedData, array $columns = ["*"], bool $isReturnObject = false): Collection|int|array|null { $updatedData = $this->builder ->where($whereClause) @@ -573,7 +573,7 @@ public function updateDataByWhereClause(array $whereClause, array $requestedData * @param string|int $id * @return mixed */ - public function deleteDataById(string|int $id) + public function deleteDataById(string|int $id): mixed { return $this->builder ->where("id", $id) @@ -584,7 +584,7 @@ public function deleteDataById(string|int $id) * @param array $whereClause * @return mixed */ - public function deleteDataByWhereClause(array $whereClause) + public function deleteDataByWhereClause(array $whereClause): mixed { return $this->builder ->where($whereClause) From 1ad04f1a25fa7b426b855dc1fa010e629e91abb5 Mon Sep 17 00:00:00 2001 From: iqbalatma Date: Tue, 19 Dec 2023 14:25:43 +0700 Subject: [PATCH 3/4] change docs data type --- src/Contracts/Abstracts/BaseQueryBuilder.php | 20 +++++++++---------- .../Abstracts/BaseQueryBuilderExtend.php | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Contracts/Abstracts/BaseQueryBuilder.php b/src/Contracts/Abstracts/BaseQueryBuilder.php index 292cb70..ee06798 100644 --- a/src/Contracts/Abstracts/BaseQueryBuilder.php +++ b/src/Contracts/Abstracts/BaseQueryBuilder.php @@ -63,16 +63,16 @@ * @method BaseQueryBuilder whereNotBetweenColumns(string $column, array $values, string $boolean = 'and') * @method static BaseQueryBuilder whereBetweenColumns(string $column, array $values, string $boolean = 'and', bool $not = false) * @method BaseQueryBuilder whereBetweenColumns(string $column, array $values, string $boolean = 'and', bool $not = false) - * @method static BaseQueryBuilder whereNotBetween(string $column, array|string $values, string $boolean = 'and') - * @method BaseQueryBuilder whereNotBetween(string $column, array|string $values, string $boolean = 'and') - * @method static BaseQueryBuilder whereBetween(string $column, array $values, string $boolean = 'and', bool $not = false) - * @method BaseQueryBuilder whereBetween(string $column, array $values, string $boolean = 'and', bool $not = false) - * @method static BaseQueryBuilder whereNot($column, ?string $operator = null, ?string $value = null, ?string $boolean = 'and') - * @method BaseQueryBuilder whereNot($column, ?string $operator = null, ?string $value = null, ?string $boolean = 'and') - * @method static BaseQueryBuilder orWhere(array|string $column, ?string $operator = null, ?string $value = null) - * @method BaseQueryBuilder orWhere(array|string $column, ?string $operator = null, ?string $value = null) - * @method static BaseQueryBuilder where(array|string $column, ?string $operator = null, ?string $value = null, ?string $boolean = 'and') - * @method BaseQueryBuilder where(array|string $column, ?string $operator = null, ?string $value = null, ?string $boolean = 'and') + * @method static BaseQueryBuilder whereNotBetween(string $column, iterable $values, string $boolean = 'and') + * @method BaseQueryBuilder whereNotBetween(string $column, iterable $values, string $boolean = 'and') + * @method static BaseQueryBuilder whereBetween(string $column, iterable $values, string $boolean = 'and', bool $not = false) + * @method BaseQueryBuilder whereBetween(string $column, iterable $values, string $boolean = 'and', bool $not = false) + * @method static BaseQueryBuilder whereNot($column, ?string $operator = null, mixed $value = null, ?string $boolean = 'and') + * @method BaseQueryBuilder whereNot($column, ?string $operator = null, mixed $value = null, ?string $boolean = 'and') + * @method static BaseQueryBuilder orWhere(array|string $column, ?string $operator = null, mixed $value = null) + * @method BaseQueryBuilder orWhere(array|string $column, ?string $operator = null, mixed $value = null) + * @method static BaseQueryBuilder where(array|string $column, ?string $operator = null, mixed $value = null, ?string $boolean = 'and') + * @method BaseQueryBuilder where(array|string $column, ?string $operator = null, mixed $value = null, ?string $boolean = 'and') * @method static BaseQueryBuilder orWhereHas(string $relation, Closure|null $callback = null, string $operator = '>=', int $count = 1) * @method BaseQueryBuilder orWhereHas(string $relation, Closure|null $callback = null, string $operator = '>=', int $count = 1) * @method static BaseQueryBuilder whereHas(string $relation, Closure|null $callback = null, string $operator = '>=', int $count = 1) diff --git a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php index 33a00d7..fcd2724 100644 --- a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php +++ b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php @@ -257,12 +257,12 @@ public function whereNot($column, ?string $operator = null, mixed $value = null, /** * @param string $column - * @param array $values + * @param iterable $values * @param string $boolean * @param bool $not * @return BaseQueryBuilder */ - public function whereBetween(string $column, array $values, string $boolean = 'and', bool $not = false): BaseQueryBuilder + public function whereBetween(string $column, iterable $values, string $boolean = 'and', bool $not = false): BaseQueryBuilder { $this->builder->whereBetween($column, $values, $boolean, $not); return $this->baseQueryBuilder; From 128d5d8e7ba6f0dbb073625a441de880583a987e Mon Sep 17 00:00:00 2001 From: iqbalatma Date: Tue, 19 Dec 2023 14:33:53 +0700 Subject: [PATCH 4/4] add templating on BaseQueryBuilderExtend --- src/Contracts/Abstracts/BaseQueryBuilder.php | 4 +-- .../Abstracts/BaseQueryBuilderExtend.php | 28 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/Contracts/Abstracts/BaseQueryBuilder.php b/src/Contracts/Abstracts/BaseQueryBuilder.php index ee06798..27597e0 100644 --- a/src/Contracts/Abstracts/BaseQueryBuilder.php +++ b/src/Contracts/Abstracts/BaseQueryBuilder.php @@ -18,7 +18,7 @@ * @method getAllData(array $whereClause = [], array $columns = ["*"]) * @method static getDataById(string|int|array $id, array $columns = ["*"]) * @method getDataById(string|int|array $id, array $columns = ["*"]) - * @method static getSingleData(array $whereClause = [], array $columns = ["*"]) + * @method static getSingleData(array $whereClause = [], array $columns = ["*"]) * @method getSingleData(array $whereClause = [], array $columns = ["*"]) * @method static addNewData(array $requestedData) * @method addNewData(array $requestedData) @@ -140,7 +140,7 @@ public function build(): Builder */ public static function init(): self { - $class = get_called_class(); + $class = static::class; return new $class; } diff --git a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php index fcd2724..5d37959 100644 --- a/src/Contracts/Abstracts/BaseQueryBuilderExtend.php +++ b/src/Contracts/Abstracts/BaseQueryBuilderExtend.php @@ -13,6 +13,9 @@ use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Validation\ValidationException; +/** + * @template T + */ class BaseQueryBuilderExtend { use QueryOrder { @@ -457,13 +460,13 @@ public function orWhereColumn(array|string $first, ?string $operator = null, ?st * @param int|null $perPage * @return LengthAwarePaginator */ - public function getAllDataPaginated(array $whereClause = [], array|null $columns = null, ?int $perPage = null):LengthAwarePaginator + public function getAllDataPaginated(array $whereClause = [], array|null $columns = null, ?int $perPage = null): LengthAwarePaginator { if (!$perPage) { $perPage = request()->query(config("queryextend.perpage.key"), config('queryextend.perpage.value')); } - if ($columns){ + if ($columns) { $this->builder->addSelect($columns); } return $this->builder @@ -474,11 +477,11 @@ public function getAllDataPaginated(array $whereClause = [], array|null $columns /** * @param array $whereClause * @param array|null $columns - * @return Builder[]|Collection + * @return Collection */ - public function getAllData(array $whereClause = [], array|null $columns = null): Collection|array + public function getAllData(array $whereClause = [], array|null $columns = null): Collection { - if ($columns){ + if ($columns) { $this->builder->addSelect($columns); } return $this->builder @@ -489,11 +492,11 @@ public function getAllData(array $whereClause = [], array|null $columns = null): /** * @param string|int|array $id * @param array|null $columns - * @return Builder|Builder[]|Collection|Model|null + * @return Builder|Builder[]|Collection|T|null */ public function getDataById(string|int|array $id, array|null $columns = null): Model|Collection|Builder|array|null { - if ($columns){ + if ($columns) { $this->builder->addSelect($columns); } return $this->builder->find($id); @@ -502,11 +505,11 @@ public function getDataById(string|int|array $id, array|null $columns = null): M /** * @param array $whereClause * @param array|null $columns - * @return Builder|Model|null + * @return Builder|T|null */ public function getSingleData(array $whereClause = [], array|null $columns = null): Model|Builder|null { - if ($columns){ + if ($columns) { $this->builder->addSelect($columns); } return $this->builder @@ -515,8 +518,9 @@ public function getSingleData(array $whereClause = [], array|null $columns = nul } /** + * * @param array $requestedData - * @return Builder|Model + * @return T|Builder */ public function addNewData(array $requestedData): Model|Builder { @@ -557,9 +561,9 @@ public function updateDataById(string|int $id, array $requestedData, array $colu * @param array $requestedData * @param array $columns * @param bool $isReturnObject - * @return Collection|int|array|null + * @return Collection|int */ - public function updateDataByWhereClause(array $whereClause, array $requestedData, array $columns = ["*"], bool $isReturnObject = false): Collection|int|array|null + public function updateDataByWhereClause(array $whereClause, array $requestedData, array $columns = ["*"], bool $isReturnObject = false): Collection|int { $updatedData = $this->builder ->where($whereClause)