예제 #1
0
 public function parser(ListorEvent $event)
 {
     $target = $event->getTarget();
     if ($target instanceof ListorableInterface) {
         $event->setTarget($target->getListorable());
     }
 }
 public function parser(ListorEvent $event)
 {
     $target = $event->getTarget();
     if ($target instanceof EntityRepository) {
         $qb = $target->createQueryBuilder('a');
         $metadata = $this->em->getClassMetadata($target->getClassName());
         // Handle only filtering of ORM Relations like OneToOne, etc...
         foreach ($event->getFilters() as $field => $filter) {
             if (!$filter['parsed'] && array_key_exists('operator', $filter) && array_key_exists('value', $filter)) {
                 switch ($filter['operator']) {
                     case Operations::CHOICE_AND:
                     case Operations::CHOICE_OR:
                     case Operations::CHOICE_NAND:
                         if ($metadata->hasAssociation($field)) {
                             if (!is_array($filter['value']) && !(is_object($filter['value']) && $filter['value'] instanceof \Traversable)) {
                                 $filter['value'] = array($filter['value']);
                             }
                             if (count($filter['value']) == 0) {
                                 continue;
                             }
                             $method = $filter['operator'] == Operations::CHOICE_NAND ? 'neq' : 'eq';
                             $qb->join('a.' . $field, 'c');
                             $exprs = array();
                             foreach ($filter['value'] as $one) {
                                 $name = $event->getUniqueName($field);
                                 $exprs[] = $qb->expr()->{$method}('c', ':' . $name);
                                 $qb->setParameter($name, $one);
                             }
                             $op = $filter['operator'] == Operations::CHOICE_OR ? 'orX' : 'andX';
                             $qb->andWhere(call_user_func_array(array($qb->expr(), $op), $exprs));
                             $event->filterParsed($field);
                         }
                         break;
                 }
             }
         }
         $event->setTarget($qb);
     }
 }