2012-08-03 15 views
13

IN的AcmePizza束,這是工作的罰款我可以使用查詢的表單生成器得到過濾收集symfony的形式

->add('pizza', 'entity', array(
       'class'   => 'Acme\PizzaBundle\Entity\Pizza', 
       'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); }, 
      )) 

我可以做這樣的事情在收集

->add('userTasks','collection',array('type' => new UserTaskType(), 
        'class'   => 'acme\myBundle\Entity\UserTask', 
        'query_builder' => function ($repository) { return $repository->createQueryBuilder('p')->orderBy('p.name', 'ASC'); }, 
       )) 
+0

那你想幹什麼?使用'query_builder'的自定義類型?如果是這樣,你可以粘貼UserTaskType的代碼嗎? – Florent 2012-08-06 14:56:09

+0

UserTask類型只有一個名爲'name'的字段。我正在加載表單上的usertasks集合。它工作正常。但我只想要一些過濾的任務,如'所有任務的狀態= 1'不是所有任務鏈接到用戶 – user825904 2012-08-07 00:06:16

回答

-2

是。

在您的UserTaskType類中,添加以下方法。

public function getDefaultOptions(array $options) 
{ 
    return array(
     'data_class' => 'acme\myBundle\Entity\UserTask', 
     'query_builder' => function($repo) { 
      return $repo->createQueryBuilder('p')->orderBy('p.name', 'ASC'); 
     } 
    ); 
} 
+1

我試圖沒有發生任何事情。我需要爲此提供回購課程嗎?我甚至在字段名稱上有錯誤,但它仍然沒有顯示任何錯誤。看起來這樣queru建設者沒有運行 – user825904 2012-08-07 01:29:52

+1

在這裏也一樣。我真的很想這樣做,但不幸的是它不是因爲某種原因:( – 2013-04-11 10:21:43

+1

它不起作用。首先你使用的方法不存在(getDefaultOptions),它應該是「setDefaultOptions」。 ,即使將* query_builder *選項放在「setDefaultOptions」方法中,它也不起作用,只是因爲它不是可用的選項。 – 2014-02-24 11:35:38

4

假設你的userTasks是一種關係你會找到你的案例here的答案。這些只是如何排序,但如果你需要一些WHERE條件,它不是那麼簡單,但也不是很難。

我不得不過濾出一些實體,解決它的關鍵是在實體類中創建set/get方法返回所需的集合。

對我來說,它看起來像這樣

/** 
* Set values 
* 
* @param ArrayCollection $values 
* @return Attribute 
*/ 
public function setCustomValues($values) 
{ 
    $result = $this->getNotCustomValues(); 
    foreach ($values as $value) 
    { 
     $value->setAttribute($this); 
     $result->add($value); 
    } 
    $this->values = $result; 

    return $this; 
} 

/** 
* Get values 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getCustomValues() 
{ 
    $result = new ArrayCollection(); 
    foreach ($this->values as $value) { 
     if($value->getCustom()) { 
      $result->add($value); 
     } 
    } 
    return $result; 
} 

而對於現場製作的形式,名稱時是「customvalues」,而不是 所以我收集只包含自定義字段真值「值」。

0

當你更新一個實體時,你經常要過濾收集,而不是一個新的實體嗎?

這裏是一個可行的解決方案,這是來自控制器(CRUD)的例子:

public function updateAction($id) 
{ 
    $service = $this->getServiceRepository()->loadOne('id', $id); 
    $this->checkPermission($service); 

    $this->filterInventoryByPrimaryLocation($service); 

    if($this->getFormHandler()->process('service_repair_service', $service, array('type' => 'update'))) 
    { 
     $this->getEntityManager()->process('persist', $service); 

     return $this->render('ServiceRepairBundle:Service:form_message.html.twig', [ 
      'message' => $this->trans('Service has been updated successfully.') 
     ]); 
    } 

    return $this->render('ServiceRepairBundle:Service:form.html.twig', [ 
     'form' => $this->getFormHandler()->getForm()->createView(), 
    ]); 
} 

private function filterInventoryByPrimaryLocation(Service $service) 
{ 
    $inventory = $service->getInventory(); 

    $criteria = Criteria::create() 
     ->where(Criteria::expr()->eq('location', $this->getUser()->getPrimaryLocation())) 
     ->orderBy(array('timeInsert' => Criteria::ASC)); 

    $service->setInventory($inventory->matching($criteria)); 
} 

$服務= ENTITY, $庫存= ArrayCollection的($服務 - > getInventory())

這裏的關鍵是使用學說的標準,更多的信息在這裏:

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections

也認爲移動的在實體本身的標準,在那裏制定一個公共的方法。從數據庫加載它時,可以使用doctrine的postLoad生命週期回調來觸發該方法。當然,如果你不需要任何服務或類似的東西,將它放入實體中也是可行的。

如果您只需要在表單內進行過濾,則另一種解決方案可能是在Form類中的Form事件中移動Criteria。

如果您需要在整個項目中透明地完成集合篩選,請編寫一個doctrine偵聽器並將代碼放入postLoad()方法中。你也可以在doctrine監聽器中注入依賴關係,但是我建議注入容器本身,因爲延遲加載其他服務,所以你不會得到循環服務引用。

祝你好運!

0

在Symfony的2.7我解決了這個做的UserTaskType如下:

<?php 

namespace AppBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Doctrine\ORM\EntityRepository; 

class UserTaskType extends AbstractType 
{ 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 

     $builder 
      ->add('the_name', 'entity', array(
       'class' => 'acme\myBundle\Entity\UserTask', 
       'query_builder' => function (EntityRepository $er) { 
        return $er->createQueryBuilder('u') 
         ->where('u.id > :id') 
         ->setParameter('id', '1') 
         ->orderBy('u.username', 'ASC'); 
       }, 
      )); 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'acme\myBundle\Entity\UserTask', 
     )); 
    } 

} 
相關問題