<?php
namespace App\Repository;
use App\Entity\Category;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
class CategoryRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, Category::class);
}
public function findOneById($id){
return $this
->findOneBy([
'id'=> $id
])
;
}
public function findByUrl($name){
$cleanName = urldecode(str_replace('-', ' ', $name));
return $this
->findOneBy([
'name'=>$cleanName
])
;
}
/*
* Return the entire menu, some issue on self referencing creating several hundred
* queries.
* Not elegant at all, and I hate myself for this. But didn't found a way for Entity recursivity yet in Symfony
*/
public function getTreeMenu(){
$query = $this->createQueryBuilder('f')
->leftJoin('f.subCategory', 'sub')
->addSelect('sub')
->leftJoin('sub.subCategory', 'ssub')
->addSelect('ssub')
->leftJoin('ssub.subCategory', 'sssub')
->addSelect('sssub')
->leftJoin('sssub.subCategory', 'ssssub')
->addSelect('ssssub')
->leftJoin('sub.categories', 'scat')
->addSelect('scat')
->leftJoin('scat.categories', 'sccat')
->addSelect('sccat')
->leftJoin('sccat.categories', 'scccat')
->addSelect('scccat')
->leftJoin('scccat.categories', 'sccccat')
->addSelect('sccccat')
->leftJoin('sccccat.categories', 'scccccat')
->addSelect('scccccat')
->leftJoin('f.categories', 'cat')
->addSelect('cat')
->leftJoin('cat.categories', 'ccat')
->addSelect('ccat')
->leftJoin('ccat.categories', 'cccat')
->addSelect('cccat')
->leftJoin('cccat.categories', 'ccccat')
->addSelect('ccccat')
->leftJoin('ccccat.categories', 'cccccat')
->addSelect('cccccat')
->leftJoin('cccccat.categories', 'ccccccat')
->addSelect('ccccccat')
->leftJoin('cat.subCategory', 'csub')
->addSelect('csub')
->where('f.subCategory is NULL')
->orderBy('f.placement', 'ASC')
->getQuery()
->getResult();
return $query;
}
public function getCategoriesBySub($sub, $results = false)
{
$query = $this->createQueryBuilder('c')
->orderBy('c.placement', 'ASC');
//->getQuery()
//->getResult()
if($results)
return $query->getQuery()->getResult();
else
return $query;
}
/*
* Return all categories that aren't in another category
*/
public function getMainCategories($returnResults=false){
$query = $this->createQueryBuilder('c')
->where('c.subCategory is NULL')
->orderBy('c.placement', 'ASC');
if($returnResults)
return $query->getQuery()->getResult();
else
return $query;
}
public function getEndCategories($results = false)
{
$query = $this->createQueryBuilder('c')
->where('c.categories is empty')
->orderBy('c.name', 'ASC')
->getQuery()
->getResult();
// if($results)
// return $query->getQuery()->getResult();
// else
// return $query;
}
/*
* Return all subcategories of a main Category
*/
public function getSubCategories($category, $returnResults=false){
$query = $this->createQueryBuilder('c')
->where('c.subCategory = :mainCategory');
if(empty($category))
$category = current($this->getMainCategories(true));
$query->setParameter('mainCategory', $category);
$query->orWhere('c.subCategory IN (:ids)')
->setParameter('ids',
$this->createQueryBuilder('s')
->where ('s.subCategory = :mainCategory')
->setParameter('mainCategory', $category)
->getQuery()->getResult()
);
$query->andWhere('c.placement > 0');
$query->orderBy('c.subCategory', 'ASC');
$query->orderBy('c.placement', 'ASC');
if($returnResults)
return $query->getQuery()->getResult();
else
return $query;
}
/*
* Return a complete array of the Categories
*/
public function getAllCategoriesAsArray($Id = 0, $catComplete = array()){
//We are building a array of the Category structure to show
$roots = $this->getCategoriesBySub($Id, true);
foreach($roots as $key => $root){
$catComplete[$key] = $this->extractValues($root);
$catComplete[$key]['sub'] = $this->getAllCategoriesAsArray($root->getId());
//$subs = $this->getCategoriesBySub($root->getId(), true);
//$catComplete[$key]['sub'][] = $this->extractValues($subs);
}
return $catComplete;
}
/*
* Small handy function to extract data from the objects
*/
private function extractValues($obj){
return array(
'id' => $obj->getId(),
'name' => $obj->getName(),
'link' => $obj->getLink(),
'subcat' => $obj->getSub()
);
}
/*
* Return all subcategories of a main Category
*/
public function getMyCategoryforplacemnt($category){
$query = $this->createQueryBuilder('c')
->select('c.id AS cateId,c.placement AS firstnameplacement, c.name As firstname')
->where('c.subCategory = :mainCategory')
->setParameter('mainCategory',$category)
->andWhere('c.placement > 0')
->orderBy('c.subCategory', 'ASC')
->orderBy('c.placement', 'ASC');
$result = $query->getQuery()->getResult();
return $result;
}
}