vendor/lexik/form-filter-bundle/Event/Listener/DoctrineApplyFilterListener.php line 40

Open in your IDE?
  1. <?php
  2. namespace Lexik\Bundle\FormFilterBundle\Event\Listener;
  3. use Doctrine\ORM\Query\Expr\Composite;
  4. use Doctrine\DBAL\Query\Expression\CompositeExpression;
  5. use Lexik\Bundle\FormFilterBundle\Event\ApplyFilterConditionEvent;
  6. use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionInterface;
  7. use Lexik\Bundle\FormFilterBundle\Filter\Condition\ConditionNodeInterface;
  8. use Lexik\Bundle\FormFilterBundle\Filter\Doctrine\DoctrineQueryBuilderAdapter;
  9. /**
  10.  * Add filter conditions on a Doctrine ORM or DBAL query builder.
  11.  *
  12.  * @author Cédric Girard <[email protected]>
  13.  */
  14. class DoctrineApplyFilterListener
  15. {
  16.     /**
  17.      * @var array
  18.      */
  19.     private $parameters;
  20.     /**
  21.      * @var string
  22.      */
  23.     private $whereMethod;
  24.     /**
  25.      * @param string $whereMethod
  26.      */
  27.     public function __construct($whereMethod)
  28.     {
  29.         $this->whereMethod = empty($whereMethod) ? 'where' sprintf('%sWhere'strtolower($whereMethod));
  30.     }
  31.     /**
  32.      * @param ApplyFilterConditionEvent $event
  33.      */
  34.     public function onApplyFilterCondition(ApplyFilterConditionEvent $event)
  35.     {
  36.         $qbAdapter = new DoctrineQueryBuilderAdapter($event->getQueryBuilder());
  37.         $conditionBuilder $event->getConditionBuilder();
  38.         $this->parameters = array();
  39.         $expression $this->computeExpression($qbAdapter$conditionBuilder->getRoot());
  40.         if (null !== $expression && $expression->count()) {
  41.             $qbAdapter->{$this->whereMethod}($expression);
  42.             foreach ($this->parameters as $name => $value) {
  43.                 if (is_array($value)) {
  44.                     list($value$type) = $value;
  45.                     $qbAdapter->setParameter($name$value$type);
  46.                 } else {
  47.                     $qbAdapter->setParameter($name$value);
  48.                 }
  49.             }
  50.         }
  51.     }
  52.     /**
  53.      * @param DoctrineQueryBuilderAdapter $queryBuilder
  54.      * @param ConditionNodeInterface      $node
  55.      * @return Composite|CompositeExpression|null
  56.      */
  57.     protected function computeExpression(DoctrineQueryBuilderAdapter $queryBuilderConditionNodeInterface $node)
  58.     {
  59.         if (count($node->getFields()) == && count($node->getChildren()) == 0) {
  60.             return null;
  61.         }
  62.         $method = ($node->getOperator() == ConditionNodeInterface::EXPR_AND) ? 'andX' 'orX';
  63.         $expression $queryBuilder->{$method}();
  64.         foreach ($node->getFields() as $condition) {
  65.             if (null !== $condition) {
  66.                 /** @var ConditionInterface $condition */
  67.                 $expression->add($condition->getExpression());
  68.                 $this->parameters array_merge($this->parameters$condition->getParameters());
  69.             }
  70.         }
  71.         foreach ($node->getChildren() as $child) {
  72.             $subExpr $this->computeExpression($queryBuilder$child);
  73.             if (null !== $subExpr && $subExpr->count()) {
  74.                 $expression->add($subExpr);
  75.             }
  76.         }
  77.         return $expression->count() ? $expression null;
  78.     }
  79. }