Example #1
0
 /**
  * @param Table                      $table
  * @param Request                    $request
  * @param \Doctrine\ORM\QueryBuilder $queryBuilder
  */
 private function addSearch(Table $table, Request $request, \Doctrine\ORM\QueryBuilder $queryBuilder)
 {
     $queryParams = $request->get($table->getFormId());
     // @todo handle all kind of filters
     foreach ($table->getAllFilters() as $filter) {
         if (isset($queryParams[$filter->getName()])) {
             $searchParamRaw = trim($queryParams[$filter->getName()]);
             list($operator, $searchParam) = $filter->getOperatorAndValue($searchParamRaw);
             if ((string) $searchParam != '') {
                 list($searchOperator, $formattedSearch) = $filter->getFormattedInput($operator, $searchParam);
                 $sql = false;
                 // depending on operator
                 switch ($searchOperator) {
                     case Filter::TYPE_GREATER:
                     case Filter::TYPE_GREATER_OR_EQUAL:
                     case Filter::TYPE_LESS:
                     case Filter::TYPE_LESS_OR_EQUAL:
                     case Filter::TYPE_NOT_EQUAL:
                         $sql = $filter->getField() . " {$searchOperator} :filter_" . $filter->getName();
                         $queryBuilder->setParameter('filter_' . $filter->getName(), $formattedSearch);
                         break;
                     case Filter::TYPE_EQUAL_STRICT:
                         $sql = $filter->getField() . ' = :filter_' . $filter->getName();
                         $queryBuilder->setParameter('filter_' . $filter->getName(), $formattedSearch);
                         break;
                     case Filter::TYPE_EQUAL:
                         $sql = $filter->getField() . ' like :filter_' . $filter->getName();
                         $queryBuilder->setParameter('filter_' . $filter->getName(), $formattedSearch);
                         break;
                     case Filter::TYPE_NOT_LIKE:
                         $sql = $filter->getField() . ' not like :filter_' . $filter->getName();
                         $queryBuilder->setParameter('filter_' . $filter->getName(), '%' . $formattedSearch . '%');
                         break;
                     case Filter::TYPE_NULL:
                         $sql = $filter->getField() . ' IS NULL';
                         break;
                     case Filter::TYPE_NOT_NULL:
                         $sql = $filter->getField() . ' IS NOT NULL';
                         break;
                     case Filter::TYPE_IN:
                         $sql = $filter->getField() . ' IN (:filter_' . $filter->getName() . ')';
                         $queryBuilder->setParameter('filter_' . $filter->getName(), '%' . $formattedSearch . '%');
                         break;
                     case Filter::TYPE_NOT_IN:
                         $sql = $filter->getField() . ' NOT IN (:filter_' . $filter->getName() . ')';
                         $queryBuilder->setParameter('filter_' . $filter->getName(), '%' . $formattedSearch . '%');
                         break;
                     default:
                     case Filter::TYPE_LIKE:
                         $sql = $filter->getField() . ' like :filter_' . $filter->getName();
                         $queryBuilder->setParameter('filter_' . $filter->getName(), '%' . $formattedSearch . '%');
                         break;
                 }
                 if (!is_null($sql)) {
                     if ($filter->getHaving()) {
                         $queryBuilder->andHaving($sql);
                     } else {
                         $queryBuilder->andWhere($sql);
                     }
                 }
             }
         }
     }
 }