2014-04-04 47 views
3

在我FormType類創建的選擇數組我有這樣的buildForm方法:Symfony2的表單生成器 - 從數據庫查詢

//... 
->add('businessUnit', 'entity', array(
       'class' => 'TrainingBundle:Employee', 
       'attr' => array('class' => 'form-control select2'), 
       'property' => 'businessUnit', 
       'empty_value' => 'All Business Units', 
       'query_builder' => function(EntityRepository $er) { 
        return $er->createQueryBuilder('e') 
         ->groupBy('e.businessUnit') 
         ->orderBy('e.businessUnit', 'ASC') 
         ; 
       }, 
       'required' => false 
//... 

這工作得很好,除了代替「businessUnit」被投<option>標籤的值我得到了員工ID。我需要的是在Employee類中的所有不同businessUnits的下拉菜單。也許我應該使用choice而不是entity,但後來我不確定如何生成選擇數組。

ANSWER 作爲公認的答案說明我有這樣的功能

private function fillBusinessUnit() { 
     $er = $this->em->getRepository('TrainingBundle:Employee'); 

     $results = $er->createQueryBuilder('e') 
       ->groupBy('e.businessUnit') 
       ->orderBy('e.businessUnit', 'ASC') 
       ->getQuery() 
       ->getResult() 
       ; 

     $businessUnit = array(); 
     foreach($results as $bu){ 
      $businessUnit[$bu->getBusinessUnit()] = $bu->getBusinessUnit(); 
     } 

     return $businessUnit; 
    } 

曾在EntityManager的傳遞到窗體。並且還將 use Doctrine\ORM\EntityManager;置於表格頂部

回答

3

改爲使用choice。它必須設置一個數組,所以創建一個方法來做到這一點。

->add("type", "choice", 
     array("label" => "Type", 
      "choices" => $this->fillBusinessUnit(), 
      "attr" => array("class" => "form-control select2"), 
      "empty_value" => 'All Business Units')) 

在這種方法中,你只需要與QueryBuilder運行查詢,然後循環的結果,填充數組並將其返回。

private function fillBusinessUnit() { 

    $results = $er->createQueryBuilder('e') 
       ->groupBy('e.businessUnit') 
       ->orderBy('e.businessUnit', 'ASC'); 

    $businessUnit = array(); 
    foreach($results as $bu){ 
     $businessUnit[] = array("id" => $bu->getId(), "name" => $bu->getName()); // and so on.. 
    } 

    return $businessUnit; 
} 

編輯

我猜你實例化一個Controller類型,所以你可以通過它在類型結構:

$em = $this->getDoctrine()->getEntityManager(); 
$form = $this->createForm(new YourType($em)); 

然後在窗體類YourType.php

class YourType extends AbstractType { 

    private $em; 

    public function __construct(EntityManager $em){ 
     $this->em = $em; 
    } 
} 

希望這個hel PS :)

+0

謝謝,這是我想的正確軌道。我怎麼會得到'$ er'變量呢? –

+0

我編輯了答案:) @NickBarrett – ponciste

+0

謝謝! 我不得不做一些改變,但它現在工作:)(把原來的問題的變化) –