symfony过滤器集合字段类型,如实体字段类型

时间:2014-11-25 14:47:21

标签: symfony doctrine-orm query-builder

我有一个带有集合字段类型的表单。 我想对实体字段类型进行过滤,但我没有找到解决方案。

我发现了其他类似的问题但到目前为止还没有令人满意的答案。我们可以这样做:

$builder
    ->add('userIngredients', 'collection', array(
            'type' => new UserImportedIngredientType($this->userIngredients),
            'query_builder'=>$this->queryBuilder,
        ))
;

如果没有,我们可以使用表单侦听器事件来基于对象属性排除某些元素吗?怎么样?

此集合表示userIngredients,我希望用户在将其属性isImported设置为true时能够更改,从而搜索query_builder解决方案。

3 个答案:

答案 0 :(得分:1)

好吧,我想我可以做一些简单的事情,比如建立一个没有附加到父实体的常规表格。

如果这可能对某人有所帮助:

class UserImportedIngredientType extends AbstractType
{

    protected $userIngredients;
    protected $userImportedIngredients;

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($this->userImportedIngredients as $userImportedIngredient)
        {
            /**
             * @var $userImportedIngredient UserIngredient
             */
            $builder
                ->add($userImportedIngredient->getId(), 'genemu_jqueryselect2_entity', array(
                        'query_builder'=>$this->userIngredients,
                        'class' => 'AppBundle:FoodAnalytics\UserIngredient',
                        'multiple' => false,
                        'label' => $userImportedIngredient->getName(),
                        'required'=>false,
                        'mapped' => false,
                        'data' => $userImportedIngredient
                    ))
            ;
        }
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'appbundle_foodanalytics_user_imported_ingredient';
    }

    public function __construct($userIngredients, $userImportedIngredients)
    {
        $this->userIngredients=$userIngredients;
        $this->userImportedIngredients=$userImportedIngredients;
    }
}

答案 1 :(得分:1)

在我的情况下,我在Symfony上添加了Sonata,这样解决了这个问题。我所做的是提供'data'参数,特定的doctrine查询实体数组结果。 (在存储库中:返回$ queryBuilder-> getQuery() - > getResult();

/** @var MyEntityRepository $myEntityRepository */
$myEntityRepository = $this->getEntityManager()->getRepository(MyEntity::class);
/** @var MyEntity[] $myEntities */
$myEntities = $myEntityRepository->findBySomeCriteriaFilter(
    $parameter, Constants::specificConstant
);

$formMapper->add(
    // html name=
    'myEntityProperty',
     \Symfony\Component\Form\Extension\Core\Type\CollectionType::class,
     [
         // specific form for MyEntity
         'entry_type' => new Form\MyEntity\MyEntityType(),
         'allow_add' => true,
         'label' => false,
         'entry_options' => [
             'label' => false
         ],
         // the filtered array of entities from doctrine repository query above
         'data' => $myEntities,
      ]
);

我猜这是用而不是sonata_type_model_list。 此外,如果要过滤sonata_type_model,请使用EntityType,并将“query_builder”选项与Closure一起使用,并返回queryBuilder而不是实体数组。这一切都非常不一致,最好不要使用symfony和sonata。

答案 2 :(得分:0)

据我所知,收藏有not have the query_builder option 所以你不能这样走。 很难用4行formType来破译你想要做的事情。

您的代码看起来没问题,除了未报告的query_builder,并且您已经将userIngredients传递给构造函数。

我的意思是,如果您需要对此进行过滤,那么您不应该在集合类型中执行此操作,而是在其他位置执行此操作。

已编辑:

但是,在第二个,你试图在错误的地方过滤集合。不在基础集合上,而是在:

 class  UserImportedIngredientType extends AbstractType {
  function __construct( $userIngredients ) {
   // Do your stuff
  }

  function buildForm( FormBuilderInterface $builder, array $options) {
   // Add here your entity with the query_filter option :)

  }
 }

检查收藏中的SO中的其他条目,有many of them