vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity/Repository/AbstractTreeRepository.php line 36

Open in your IDE?
  1. <?php
  2. namespace Gedmo\Tree\Entity\Repository;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Doctrine\ORM\EntityRepository;
  5. use Doctrine\ORM\Mapping\ClassMetadata;
  6. use Gedmo\Tool\Wrapper\EntityWrapper;
  7. use Gedmo\Tree\RepositoryUtils;
  8. use Gedmo\Tree\RepositoryUtilsInterface;
  9. use Gedmo\Tree\RepositoryInterface;
  10. use Gedmo\Exception\InvalidArgumentException;
  11. use Gedmo\Tree\TreeListener;
  12. abstract class AbstractTreeRepository extends EntityRepository implements RepositoryInterface
  13. {
  14.     /**
  15.      * Tree listener on event manager
  16.      *
  17.      * @var TreeListener
  18.      */
  19.     protected $listener null;
  20.     /**
  21.      * Repository utils
  22.      */
  23.     protected $repoUtils null;
  24.     /**
  25.      * {@inheritdoc}
  26.      */
  27.     public function __construct(EntityManagerInterface $emClassMetadata $class)
  28.     {
  29.         parent::__construct($em$class);
  30.         $treeListener null;
  31.         foreach ($em->getEventManager()->getListeners() as $listeners) {
  32.             foreach ($listeners as $listener) {
  33.                 if ($listener instanceof TreeListener) {
  34.                     $treeListener $listener;
  35.                     break;
  36.                 }
  37.             }
  38.             if ($treeListener) {
  39.                 break;
  40.             }
  41.         }
  42.         if (is_null($treeListener)) {
  43.             throw new \Gedmo\Exception\InvalidMappingException('Tree listener was not found on your entity manager, it must be hooked into the event manager');
  44.         }
  45.         $this->listener $treeListener;
  46.         if (!$this->validate()) {
  47.             throw new \Gedmo\Exception\InvalidMappingException('This repository cannot be used for tree type: '.$treeListener->getStrategy($em$class->name)->getName());
  48.         }
  49.         $this->repoUtils = new RepositoryUtils($this->_em$this->getClassMetadata(), $this->listener$this);
  50.     }
  51.     /**
  52.      * @return \Doctrine\ORM\QueryBuilder
  53.      */
  54.     protected function getQueryBuilder()
  55.     {
  56.         return $this->getEntityManager()->createQueryBuilder();
  57.     }
  58.     /**
  59.      * Sets the RepositoryUtilsInterface instance
  60.      *
  61.      * @param \Gedmo\Tree\RepositoryUtilsInterface $repoUtils
  62.      *
  63.      * @return static
  64.      */
  65.     public function setRepoUtils(RepositoryUtilsInterface $repoUtils)
  66.     {
  67.         $this->repoUtils $repoUtils;
  68.         return $this;
  69.     }
  70.     /**
  71.      * Returns the RepositoryUtilsInterface instance
  72.      *
  73.      * @return \Gedmo\Tree\RepositoryUtilsInterface|null
  74.      */
  75.     public function getRepoUtils()
  76.     {
  77.         return $this->repoUtils;
  78.     }
  79.     /**
  80.      * {@inheritDoc}
  81.      */
  82.     public function childCount($node null$direct false)
  83.     {
  84.         $meta $this->getClassMetadata();
  85.         if (is_object($node)) {
  86.             if (!($node instanceof $meta->name)) {
  87.                 throw new InvalidArgumentException("Node is not related to this repository");
  88.             }
  89.             $wrapped = new EntityWrapper($node$this->_em);
  90.             if (!$wrapped->hasValidIdentifier()) {
  91.                 throw new InvalidArgumentException("Node is not managed by UnitOfWork");
  92.             }
  93.         }
  94.         $qb $this->getChildrenQueryBuilder($node$direct);
  95.         // We need to remove the ORDER BY DQL part since some vendors could throw an error
  96.         // in count queries
  97.         $dqlParts $qb->getDQLParts();
  98.         // We need to check first if there's an ORDER BY DQL part, because resetDQLPart doesn't
  99.         // check if its internal array has an "orderby" index
  100.         if (isset($dqlParts['orderBy'])) {
  101.             $qb->resetDQLPart('orderBy');
  102.         }
  103.         $aliases $qb->getRootAliases();
  104.         $alias $aliases[0];
  105.         $qb->select('COUNT('.$alias.')');
  106.         return (int) $qb->getQuery()->getSingleScalarResult();
  107.     }
  108.     /**
  109.      * @see \Gedmo\Tree\RepositoryUtilsInterface::childrenHierarchy
  110.      */
  111.     public function childrenHierarchy($node null$direct false, array $options = array(), $includeNode false)
  112.     {
  113.         return $this->repoUtils->childrenHierarchy($node$direct$options$includeNode);
  114.     }
  115.     /**
  116.      * @see \Gedmo\Tree\RepositoryUtilsInterface::buildTree
  117.      */
  118.     public function buildTree(array $nodes, array $options = array())
  119.     {
  120.         return $this->repoUtils->buildTree($nodes$options);
  121.     }
  122.     /**
  123.      * @see \Gedmo\Tree\RepositoryUtilsInterface::buildTreeArray
  124.      */
  125.     public function buildTreeArray(array $nodes)
  126.     {
  127.         return $this->repoUtils->buildTreeArray($nodes);
  128.     }
  129.     /**
  130.      * @see \Gedmo\Tree\RepositoryUtilsInterface::setChildrenIndex
  131.      */
  132.     public function setChildrenIndex($childrenIndex)
  133.     {
  134.         $this->repoUtils->setChildrenIndex($childrenIndex);
  135.     }
  136.     /**
  137.      * @see \Gedmo\Tree\RepositoryUtilsInterface::getChildrenIndex
  138.      */
  139.     public function getChildrenIndex()
  140.     {
  141.         return $this->repoUtils->getChildrenIndex();
  142.     }
  143.     /**
  144.      * Checks if current repository is right
  145.      * for currently used tree strategy
  146.      *
  147.      * @return bool
  148.      */
  149.     abstract protected function validate();
  150.     /**
  151.      * Get all root nodes query builder
  152.      *
  153.      * @param string - Sort by field
  154.      * @param string - Sort direction ("asc" or "desc")
  155.      *
  156.      * @return \Doctrine\ORM\QueryBuilder - QueryBuilder object
  157.      */
  158.     abstract public function getRootNodesQueryBuilder($sortByField null$direction 'asc');
  159.     /**
  160.      * Get all root nodes query
  161.      *
  162.      * @param string - Sort by field
  163.      * @param string - Sort direction ("asc" or "desc")
  164.      *
  165.      * @return \Doctrine\ORM\Query - Query object
  166.      */
  167.     abstract public function getRootNodesQuery($sortByField null$direction 'asc');
  168.     /**
  169.      * Returns a QueryBuilder configured to return an array of nodes suitable for buildTree method
  170.      *
  171.      * @param object  $node        - Root node
  172.      * @param bool    $direct      - Obtain direct children?
  173.      * @param array   $options     - Options
  174.      * @param boolean $includeNode - Include node in results?
  175.      *
  176.      * @return \Doctrine\ORM\QueryBuilder - QueryBuilder object
  177.      */
  178.     abstract public function getNodesHierarchyQueryBuilder($node null$direct false, array $options = array(), $includeNode false);
  179.     /**
  180.      * Returns a Query configured to return an array of nodes suitable for buildTree method
  181.      *
  182.      * @param object  $node        - Root node
  183.      * @param bool    $direct      - Obtain direct children?
  184.      * @param array   $options     - Options
  185.      * @param boolean $includeNode - Include node in results?
  186.      *
  187.      * @return \Doctrine\ORM\Query - Query object
  188.      */
  189.     abstract public function getNodesHierarchyQuery($node null$direct false, array $options = array(), $includeNode false);
  190.     /**
  191.      * Get list of children followed by given $node. This returns a QueryBuilder object
  192.      *
  193.      * @param object  $node        - if null, all tree nodes will be taken
  194.      * @param boolean $direct      - true to take only direct children
  195.      * @param string  $sortByField - field name to sort by
  196.      * @param string  $direction   - sort direction : "ASC" or "DESC"
  197.      * @param bool    $includeNode - Include the root node in results?
  198.      *
  199.      * @return \Doctrine\ORM\QueryBuilder - QueryBuilder object
  200.      */
  201.     abstract public function getChildrenQueryBuilder($node null$direct false$sortByField null$direction 'ASC'$includeNode false);
  202.     /**
  203.      * Get list of children followed by given $node. This returns a Query
  204.      *
  205.      * @param object  $node        - if null, all tree nodes will be taken
  206.      * @param boolean $direct      - true to take only direct children
  207.      * @param string  $sortByField - field name to sort by
  208.      * @param string  $direction   - sort direction : "ASC" or "DESC"
  209.      * @param bool    $includeNode - Include the root node in results?
  210.      *
  211.      * @return \Doctrine\ORM\Query - Query object
  212.      */
  213.     abstract public function getChildrenQuery($node null$direct false$sortByField null$direction 'ASC'$includeNode false);
  214. }