2012-07-12 23 views
5

Tengo una lista de elementos para mostrar en una página, con un formulario de búsqueda encima para filtrar estos elementos, como en cualquier back-end habitual. El problema es que no sé cómo agregar los criterios de búsqueda a una consulta existente con combinaciones ... Esto es lo que tengo:Cómo implementar un formulario de filtro de búsqueda con Symfony2

Utilizo un método específico en el repositorio asociado a la entidad para agregar uniones en el consulta (para evitar muchas consultas). El controlador es el siguiente:

class ModelController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 
     // ... 
     $em = $this->getDoctrine()->getManager(); 
     $query = $em->getRepository('AcmeDemoBundle:Item')->getList(); 
    } 
} 

El método getList en el repositorio es el siguiente:

use Doctrine\ORM\EntityRepository; 

// ... 

class ItemRepository extends EntityRepository 
{ 
    public function getList() 
    { 
     $queryBuilder = $this 
      ->createQueryBuilder('i') 
      ->innerJoin('i.brand', 'b'); 

     return $queryBuilder->getQuery(); 
    } 
} 

que crea un objeto ItemSearchType formulario con varios campos para buscar elementos.

¿Cómo puedo agregar fácilmente los criterios de búsqueda de los datos proporcionados en el formulario de búsqueda para mostrar los elementos filtrados?

Esto es lo que hay en mi regulador en relación con la búsqueda:

class ModelController extends Controller 
{ 
    public function indexAction(Request $request) 
    { 

     // ... 
     if ($request->getMethod() === 'POST') { 
      $searchForm->bindRequest($request); 

      if ($searchForm->isValid()) { 
       $searchCriteria = $searchForm->getData(); 

       // Do something with this data! ...but I don't know how 
      } 
    } 
} 

Gracias!

Respuesta

8

Esto es lo que me gustaría probar:

public function getListBy($criteria) 
{ 
    $qb = $this->createQueryBuilder('i'); 

    $qb->innerJoin('i.brand', 'b'); 

    foreach ($criteria as $field => $value) { 
     if (!$this->getClassMetadata()->hasField($field)) { 
      // Make sure we only use existing fields (avoid any injection) 
      continue; 
     } 

     $qb ->andWhere($qb->expr()->eq('i.'.$field, ':i_'.$field)) 
      ->setParameter('i_'.$field, $value); 
    } 

    return $qb->getQuery()->getResult(); 
} 
2

Aquí he publicado un answer para esto, yo uso LexikFormFilterBundle filterTypes y QueryBuilder, además de un TypeGuesser hice que abstrae el proceso de creación filterForm.

puede instalar ambos servicios como paquetes separados con Composer. El código resultante es más limpio

Desde el README, en caso de que no desea navegar github: P

/** 
* Creates a Filter form to search for Entities. 
* 
* @param AbstractType|string $formType The `generate:doctrine:form` generated Type or its FQCN. 
* 
* @return \Symfony\Component\Form\Form The filter Form 
*/ 
private function createFilterForm($formType) 
{ 
    $adapter = $this->get('dd_form.form_adapter'); 
    $form = $adapter->adaptForm(
     $formType, 
     $this->generateUrl('document_search'), 
     array('fieldToRemove1', 'fieldToRemove2') 
    ); 
    return $form; 
} 

Está roto para SF> = 2,8 necesita una solución here

+1

Esta es la mejor respuesta. LexikFormFilterBundle resuelve el problema de filtrar una entidad. La respuesta de AdrienBrault también funcionaría, pero no es capaz de filtrar por, por ejemplo, daterange. –

+0

Gracias por el consejo con LexikFormFilterBundle me estaba cansando de todas las preguntas y respuestas de filtro. el paquete de filtros ahorra mucho trabajo y complicaciones allí :) – Sharpy35

Cuestiones relacionadas