2012-07-12 16 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 निर्माण प्रक्रिया सार बना दिया।

आप दोनों सेवाओं को संगीतकार के साथ अलग बंडल के रूप में स्थापित कर सकते हैं। जिसके परिणामस्वरूप कोड क्लीनर

README से है, मामले में आप GitHub पर नेविगेट नहीं करना चाहता: पी

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

यह एस एफ के लिए टूट गया है> = 2.8 एक फिक्स here

+1

की आवश्यकता है यह सबसे अच्छा जवाब है। LexikFormFilterBundle एक इकाई फ़िल्टरिंग की समस्या हल करता है। AdrienBrault का जवाब भी काम करेगा, लेकिन i.e. daterange द्वारा फ़िल्टरिंग करने में सक्षम नहीं है। –

+0

LexikFormFilterBundle के साथ सलाह के लिए धन्यवाद मैं फिल्टर प्रश्नों में सभी और Wheres के बीमार हो रहा था। फिल्टर बंडल वहाँ बहुत सारे काम और जटिलता बचाता है :) – Sharpy35