2012-07-12 5 views
5

일반적인 백엔드처럼 이러한 항목을 필터링 할 수있는 검색 양식이있는 페이지에 표시 할 항목 목록이 있습니다. 문제는 조인과 함께 기존 쿼리에 검색 조건을 추가하는 방법을 알지 못한다는 것입니다. 다음은 내가 가지고있는 것입니다.Symfony2를 사용하여 검색 필터 양식을 구현하는 방법

엔터티에 연결된 리포지토리에서 특정 메서드를 사용하여 쿼리 (많은 쿼리를 피하기 위해). 컨트롤러는 다음과 같습니다 저장소에

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

getList 방법은 다음과 같습니다

use Doctrine\ORM\EntityRepository; 

// ... 

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

     return $queryBuilder->getQuery(); 
    } 
} 

나는 항목을 검색하기 위해 여러 분야와 ItemSearchType 양식 객체를 만들었습니다.

검색 양식에 제공된 데이터에서 검색 기준을 쉽게 추가하여 필터링 된 항목을 표시하려면 어떻게합니까?

이 검색 양식에 관한 내 컨트롤러에 무엇이입니다 :

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 
      } 
    } 
} 

감사합니다!

답변

8

여기 내가 시도 할 작업은 다음과 같습니다

여기
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

나는이에 대한 answer을 게시, 나는 LexikFormFilterBundle filterTypes을 사용하고 QueryBuilder 플러스 TypeGuesser 나는 그게 filterForm 생성 과정을 추상화했다.

두 서비스를 모두 작성자와 함께 번들로 설치할 수 있습니다. 결과 코드는 경우에 당신이 github에로 이동하지 마십시오 README에서

청소기입니다 : 그것은 SF에 대한 생겼습니다

/** 
* 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; 
} 

P> = 2.8 수정 here

+1

필요 이것이 최고의 대답입니다. LexikFormFilterBundle은 엔티티 필터링 문제를 해결합니다. AdrienBrault의 답변도 제대로 작동하지만, 즉 daterange로 필터링 할 수는 없습니다. –

+0

LexikFormFilterBundle에 대한 조언을 주셔서 감사합니다. 필터 쿼리의 모든 andWheres에 질 렸습니다. 필터 번들은 많은 작업과 복잡성을 절약합니다 :) – Sharpy35

관련 문제