aboutsummaryrefslogtreecommitdiffstats
path: root/core/namespace/ORM/Repositories/Category.php
diff options
context:
space:
mode:
authorThomas Lange <code@nerdmind.de>2021-07-22 14:00:12 +0200
committerThomas Lange <code@nerdmind.de>2021-07-22 14:00:12 +0200
commit59392e460020447720089976b83139ad59d275fe (patch)
tree25cc766f352d9ae6319d22d43388db563d6ba404 /core/namespace/ORM/Repositories/Category.php
parent912a19ef8c58b87ac075d21cee0425f7715b4f94 (diff)
downloadblog-59392e460020447720089976b83139ad59d275fe.tar.gz
blog-59392e460020447720089976b83139ad59d275fe.tar.xz
blog-59392e460020447720089976b83139ad59d275fe.zip
Rename: Append "Repository" to repository classes
Rename the repository classes and append the name with "Repository" to prevent naming confusions with the entity classes.
Diffstat (limited to 'core/namespace/ORM/Repositories/Category.php')
-rw-r--r--core/namespace/ORM/Repositories/Category.php137
1 files changed, 0 insertions, 137 deletions
diff --git a/core/namespace/ORM/Repositories/Category.php b/core/namespace/ORM/Repositories/Category.php
deleted file mode 100644
index df32f69..0000000
--- a/core/namespace/ORM/Repositories/Category.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-namespace ORM\Repositories;
-use ORM\Repository;
-use ORM\EntityInterface;
-use ORM\Entities\Category as CategoryEntity;
-
-class Category extends Repository {
- public static function getTableName(): string { return 'category'; }
- public static function getClassName(): string { return 'ORM\Entities\Category'; }
-
- #===============================================================================
- # Get number of *posts* assigned to $Category
- #===============================================================================
- public function getNumberOfPosts(CategoryEntity $Category): int {
- $query = 'SELECT COUNT(id) FROM %s WHERE category = ?';
- $query = sprintf($query, Post::getTableName());
-
- $Statement = $this->Database->prepare($query);
- $Statement->execute([$Category->getID()]);
-
- return $Statement->fetchColumn();
- }
-
- #===============================================================================
- # Find category with parents based on primary key
- #===============================================================================
- public function findWithParents($id): array {
- return $this->findWithParentsBy('id', $id);
- }
-
- #===============================================================================
- # Find category with parents based on specific field comparison
- #===============================================================================
- public function findWithParentsBy(string $field, $value): array {
- $query = 'WITH RECURSIVE tree AS (
- SELECT *, 0 AS _depth FROM %s WHERE %s %s UNION
- SELECT c.*, _depth+1 FROM %s c, tree WHERE tree.parent = c.id
- ) SELECT * FROM tree ORDER BY _depth DESC';
-
- $table = static::getTableName();
- $check = is_null($value) ? 'IS NULL': '= ?';
- $query = sprintf($query, $table, $field, $check, $table);
-
- $Statement = $this->Database->prepare($query);
- $Statement->execute([$value]);
-
- # TODO: Virtual column _depth shall not be fetched into the entity class
- return $this->fetchEntities($Statement);
- }
-
- #===============================================================================
- # Get paginated category tree list
- #===============================================================================
- public function getPaginatedTree(int $limit, int $offset = 0): array {
- $query = 'WITH RECURSIVE tree AS (
- SELECT *, name AS _depth FROM %s WHERE parent IS NULL UNION
- SELECT c.*, CONCAT(_depth, "/", c.name) AS _depth FROM %s c INNER JOIN tree ON tree.id = c.parent
- ) SELECT * FROM tree ORDER BY _depth %s';
-
- $_limit = "LIMIT $limit";
-
- if($offset) {
- $_limit = "LIMIT $offset,$limit";
- }
-
- $table = static::getTableName();
- $query = sprintf($query, $table, $table, $_limit);
-
- $Statement = $this->Database->prepare($query);
- $Statement->execute();
-
- return $this->fetchEntities($Statement);
- }
-
- #===============================================================================
- # Get number of children categories assigned to $Category
- #===============================================================================
- public function getNumberOfChildren(CategoryEntity $Category): int {
- $query = 'WITH RECURSIVE tree AS (
- SELECT * FROM %s WHERE id = ? UNION
- SELECT c.* FROM %s c, tree WHERE tree.id = c.parent
- ) SELECT COUNT(id) FROM tree WHERE id != ?';
-
- $query = sprintf($query,
- static::getTableName(),
- static::getTableName()
- );
-
- $Statement = $this->Database->prepare($query);
- $Statement->execute([$Category->getID(), $Category->getID()]);
-
- return $Statement->fetchColumn();
- }
-
- #===============================================================================
- # Update category (and check for parent/child circular loops)
- #===============================================================================
- public function update(EntityInterface $Entity): bool {
- # Entity parent might have changed *in memory*, so we re-fetch the original
- # parent of the entity from the database and save it in a variable.
- # TODO: Repository/Entity class should have a mechanism to detect changes!
- $query = 'SELECT parent FROM %s WHERE id = ?';
- $query = sprintf($query, static::getTableName());
-
- $Statement = $this->Database->prepare($query);
- $Statement->execute([$Entity->getID()]);
-
- $parent = $Statement->fetchColumn();
-
- # If parent is unchanged, circular loop check is not needed.
- if($parent === $Entity->get('parent')) {
- return parent::update($Entity);
- }
-
- $_parent = $Entity->get('parent');
-
- # Fetch the parent of the *new* parent category and let the while loop run through
- # the tree until either a parent of "NULL" was found or if the new parent category
- # is a *child* of the *current* category which would cause a circular loop.
- while($Statement->execute([$_parent]) && $_parent = $Statement->fetchColumn()) {
- if($_parent == $Entity->get('id')) {
- # Set parent of the *new* parent category to the *original* parent category
- # of the *current* category (one level up) to prevent a circular loop.
- $query = 'UPDATE %s SET parent = ? WHERE id = ?';
- $query = sprintf($query, static::getTableName());
-
- $UpdateStatement = $this->Database->prepare($query);
- $UpdateStatement->execute([$parent, $Entity->get('parent')]);
- break;
- } else if($_parent === NULL) {
- break;
- }
- }
-
- return parent::update($Entity);
- }
-}