1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
<?php
/* --------------------------------------------------------------
CategoryRepositoryDeleter.inc.php 2017-06-15
Gambio GmbH
http://www.gambio.de
Copyright (c) 2015 Gambio GmbH
Released under the GNU General Public License (Version 2)
[http://www.gnu.org/licenses/gpl-2.0.html]
--------------------------------------------------------------
*/
/**
* Class CategoryRepositoryDeleter
*
* This class deletes category records from the database and is used in the category repository among the classes for
* writing and reading category records.
*
* @category System
* @package Category
* @subpackage Repositories
*/
class CategoryRepositoryDeleter implements CategoryRepositoryDeleterInterface
{
/**
* Database connector.
*
* @var CI_DB_query_builder
*/
protected $db;
/**
* @var \ProductRepositoryInterface
*/
protected $productRepository;
/**
* CategoryRepositoryDeleter constructor.
*
* @param CI_DB_query_builder $db Database connector.
* @param ProductRepositoryInterface $productRepository Products repository with functionality to remove products.
*/
public function __construct(CI_DB_query_builder $db, ProductRepositoryInterface $productRepository)
{
$this->db = $db;
$this->productRepository = $productRepository;
}
/**
* Deletes a specific category entity.
*
* @param IdType $categoryId Category ID.
*
* @return CategoryRepositoryDeleter Same instance for chained method calls.
*/
public function deleteById(IdType $categoryId)
{
$this->db->delete(['categories', 'categories_description', 'products_to_categories'],
['categories_id' => $categoryId->asInt()]);
return $this;
}
/**
* Deletes related products of given category.
* All products that are only connected to the given category gets removed.
*
* @param \IdCollection $categoryIds Ids of categories with products to be removed.
*
* @return $this|CategoryRepositoryDeleterInterface Same instance for chained method calls.
*/
public function deleteRelatedProductsOfCategory(IdCollection $categoryIds)
{
$productIdsToRemove = [];
$products = [];
foreach($categoryIds->getArray() as $categoryId)
{
$productsInCategory = $this->db->select('products_id')
->from('products_to_categories')
->where('categories_id', $categoryId->asInt())
->get()
->result_array();
foreach($productsInCategory as $productInCategory)
{
$products[$productInCategory['products_id']]['categories'][] = $categoryId->asInt();
}
}
foreach($products as $productId => $product)
{
$productsTotal = $this->db->select('COUNT(*) as total')
->from('products_to_categories')
->where('products_id', $productId)
->where_not_in('categories_id', $product['categories'])
->get()
->row_array()['total'];
if((int)$productsTotal === 0)
{
$productIdsToRemove[] = $productId;
}
}
foreach($productIdsToRemove as $productId)
{
$this->productRepository->deleteProductById(new IdType($productId));
}
return $this;
}
}