From 45dab2fcf5894793dc84529a2fe3c84537296f9f Mon Sep 17 00:00:00 2001 From: jskesters Date: Sat, 12 Sep 2020 10:09:53 +0300 Subject: [PATCH] 1 Db Query is born --- .gitignore | 7 ++ composer.json | 30 +++++++++ src/DbQuery.php | 49 ++++++++++++++ src/DbQueryBuilder.php | 53 +++++++++++++++ src/filters/DbFilter.php | 117 +++++++++++++++++++++++++++++++++ src/filters/DbFilterType.php | 15 +++++ src/filters/DbFilters.php | 32 +++++++++ src/filters/DbFiltersGroup.php | 55 ++++++++++++++++ src/filters/EmptyDbFilter.php | 12 ++++ src/filters/Filter.php | 8 +++ src/order/DbOrder.php | 32 +++++++++ src/order/DbOrderDirection.php | 9 +++ src/order/Order.php | 10 +++ src/page/DbPage.php | 40 +++++++++++ src/page/Page.php | 12 ++++ 15 files changed, 481 insertions(+) create mode 100644 .gitignore create mode 100644 composer.json create mode 100644 src/DbQuery.php create mode 100644 src/DbQueryBuilder.php create mode 100644 src/filters/DbFilter.php create mode 100644 src/filters/DbFilterType.php create mode 100644 src/filters/DbFilters.php create mode 100644 src/filters/DbFiltersGroup.php create mode 100644 src/filters/EmptyDbFilter.php create mode 100644 src/filters/Filter.php create mode 100644 src/order/DbOrder.php create mode 100644 src/order/DbOrderDirection.php create mode 100644 src/order/Order.php create mode 100644 src/page/DbPage.php create mode 100644 src/page/Page.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd6ad41 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# Ide's +.idea +.vscode +.settings/ +.classpath +.project +nbproject diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..0bea150 --- /dev/null +++ b/composer.json @@ -0,0 +1,30 @@ +{ + "name": "clean-bandits/db-query", + "description": "Simple PHP OOP library for creating database queries", + "keywords": [ + "php", + "oop", + "db", + "query", + "dal" + ], + "homepage": "https://github.com/CleanBandits/DbQuery", + "license": "MIT", + "authors": [ + { + "name": "Clean Bandits" + } + ], + "require": { + "php": "^7.2" + }, + "minimum-stability": "stable", + "autoload": { + "psr-4": { + "CleanBandits\\DbQuery\\": "src/" + }, + "files": [ + "src/I18n/format.php" + ] + } +} diff --git a/src/DbQuery.php b/src/DbQuery.php new file mode 100644 index 0000000..96c7a73 --- /dev/null +++ b/src/DbQuery.php @@ -0,0 +1,49 @@ +order = $order; + $this->page = $page; + $this->filters = $filters; + } + + public function order(): ?Order + { + return $this->order; + } + + public function page(): ?Page + { + return $this->page; + } + + public function filters(): ?Filter + { + return $this->filters; + } +} diff --git a/src/DbQueryBuilder.php b/src/DbQueryBuilder.php new file mode 100644 index 0000000..7f4f344 --- /dev/null +++ b/src/DbQueryBuilder.php @@ -0,0 +1,53 @@ +order = $order; + return $this; + } + + public function filters(DbFilters $filters): self + { + $this->filters = $filters; + return $this; + } + + public function page(DbPage $page): self + { + $this->page = $page; + return $this; + } + + public function query(): DbQuery + { + return new DbQuery( + isset($this->order) ? $this->order : null, + isset($this->page) ? $this->page : null, + isset($this->filters) ? $this->filters : null + ); + } +} diff --git a/src/filters/DbFilter.php b/src/filters/DbFilter.php new file mode 100644 index 0000000..24efbb8 --- /dev/null +++ b/src/filters/DbFilter.php @@ -0,0 +1,117 @@ +column = $column; + $this->value = $value; + $this->type = $type; + } + + /** + * DbFilter constructor. + * @param string $column + * @param string|int|array $value + * @return DbFilter + */ + public static function constructLike(string $column, $value): self + { + return new self($column, $value, DbFilterType::Like); + } + + /** + * DbFilter constructor. + * @param string $column + * @param string|int|array $value + * @return DbFilter + */ + public static function constructNotLike(string $column, $value): self + { + return new self($column, $value, DbFilterType::NotLike); + } + + /** + * DbFilter constructor. + * @param string $column + * @param string|int|array $value + * @return DbFilter + */ + public static function constructEquals(string $column, $value): self + { + return new self($column, $value, DbFilterType::Equals); + } + + /** + * DbFilter constructor. + * @param string $column + * @param string|int|array $value + * @return DbFilter + */ + public static function constructNotEquals(string $column, $value): self + { + return new self($column, $value, DbFilterType::NotEquals); + } + + /** + * DbFilter constructor. + * @param string $column + * @param string|int|array $value + * @return DbFilter + */ + public static function constructIn(string $column, $value): self + { + return new self($column, $value, DbFilterType::In); + } + + /** + * DbFilter constructor. + * @param string $column + * @param string|int|array $value + * @return DbFilter + */ + public static function constructNotIn(string $column, $value): self + { + return new self($column, $value, DbFilterType::NotEquals); + } + + public function sql(): string + { + return $this->column() . ' ' . $this->type . ' (' . $this->value() . ')'; + } + + protected function column(): string + { + return $this->column; + } + + protected function value() + { + return $this->value; + } +} + diff --git a/src/filters/DbFilterType.php b/src/filters/DbFilterType.php new file mode 100644 index 0000000..0742560 --- /dev/null +++ b/src/filters/DbFilterType.php @@ -0,0 +1,15 @@ +filtersGroup = $filtersGroup; + } + + public static function constructFromGroup(DbFiltersGroup $filtersGroup): self + { + return new self($filtersGroup); + } + + public static function constructFromFilter(Filter $dbFilter): self + { + return new self(DbFiltersGroup::constructAndGroup([$dbFilter])); + } + + public function sql(): string + { + return $this->filtersGroup->sql(); + } +} diff --git a/src/filters/DbFiltersGroup.php b/src/filters/DbFiltersGroup.php new file mode 100644 index 0000000..d82a033 --- /dev/null +++ b/src/filters/DbFiltersGroup.php @@ -0,0 +1,55 @@ +filters = $filters; + $this->join = $join; + } + + /** + * @param Filter[]|DbFiltersGroup[] $filters + * @return DbFiltersGroup + */ + public static function constructAndGroup(array $filters): self + { + return new self($filters, 'AND'); + } + + /** + * @param Filter[]|DbFiltersGroup[] $filters + * @return DbFiltersGroup + */ + public static function constructOrGroup(array $filters): self + { + return new self($filters, 'OR'); + } + + public function sql(): string + { + $filters = array_map(function (Filter $filter) { + return $filter->sql(); + }, $this->filters); + return '(' . implode(' ' . $this->join . ' ', $filters) . ')'; + } +} diff --git a/src/filters/EmptyDbFilter.php b/src/filters/EmptyDbFilter.php new file mode 100644 index 0000000..9b2de50 --- /dev/null +++ b/src/filters/EmptyDbFilter.php @@ -0,0 +1,12 @@ +ordering = $columnOrdering; + } + + public static function fromSingleColumn(string $column, string $direction) + { + return new self([$column => $direction]); + } + + public function orderingFormatted(): string + { + return implode(',', array_map(function ($column, $direction) { + return $column . ' ' . $direction; + }, array_keys($this->ordering), $this->ordering)); + } +} diff --git a/src/order/DbOrderDirection.php b/src/order/DbOrderDirection.php new file mode 100644 index 0000000..9367de3 --- /dev/null +++ b/src/order/DbOrderDirection.php @@ -0,0 +1,9 @@ +pageNumber = $pageNumber; + $this->itemsPerPage = $itemsPerPage; + $this->itemsDeviation = $itemsDeviation; + } + + public function offset(): int + { + return ($this->pageNumber - 1) * $this->itemsPerPage + $this->itemsDeviation; + } + + public function itemsPerPage(): int + { + return $this->itemsPerPage; + } +} diff --git a/src/page/Page.php b/src/page/Page.php new file mode 100644 index 0000000..ce0f4cf --- /dev/null +++ b/src/page/Page.php @@ -0,0 +1,12 @@ +