代码之家  ›  专栏  ›  技术社区  ›  Geoff Maddock

Symfony-EntityType select重复相同的选项

  •  0
  • Geoff Maddock  · 技术社区  · 9 年前

    在Symfony 3.3.4中构建表单,并使用 EntityType 获取对象的选择列表。

    出于某种原因,当我使用某个实体时,选择列表返回具有相同id的所有相同选项,即使数据库表包含具有不同id和名称的行。

    $form->add('projectComplexity', EntityType::class, array(
        'class' => 'AppBundle:ProjectComplexity',
        'choice_label' => 'name',
        'choice_value' => 'id',
        'placeholder' => 'Choose an option',
        'label_attr' => array('title' => 'Project complexity associated with this project'),
        'query_builder' => function (EntityRepository $v) {
            return $v->createQueryBuilder('v')->orderBy('v.name',' ASC');
        },
    ))
    

    enter image description here

    <?php
    
    namespace AppBundle\Form;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    use Symfony\Component\Form\Extension\Core\Type\TextType;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;
    use Doctrine\ORM\EntityRepository;
    
    class ProductType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('productCategory', EntityType::class,
                    array(
                        'class' => 'AppBundle:ProductCategory',
                        'choice_label' => 'name',
                        'choice_value' => 'id',
                        'placeholder' => 'Choose an option',
                        'label_attr' => array('title' => 'Category for this product'),
                        'query_builder' => function (EntityRepository $v) {
                            return $v->createQueryBuilder('v')
                                ->orderBy('v.name',' ASC');
                        }
                    ))
                ->add('name',TextType::class)
                ->add('detail',TextType::class)
                ->add('description',TextareaType::class, array(
                    'attr' => array('cols' => '80', 'rows' => '10')
                ))
                ->add('supportDescription',TextareaType::class, array(
                    'attr' => array('cols' => '80', 'rows' => '10')
                ))
                ->add('isCircuit', CheckboxType::class,  array('required' => false))
                ->add('deliveryType', EntityType::class,
                    array(
                        'class' => 'AppBundle:DeliveryType',
                        'choice_label' => 'name',
                        'choice_value' => 'id',
                        'label_attr' => array('title' => 'Type of delivery for this product'),
                        'query_builder' => function (EntityRepository $v) {
                            return $v->createQueryBuilder('v')
                                ->orderBy('v.name',' ASC');
                        }
                    ))
                ->add('projectComplexity', EntityType::class,
                    array(
                        'class' => 'AppBundle:ProjectComplexity',
                        'choice_label' => 'name',
                        'choice_value' => 'id',
                        'placeholder' => 'Choose an option',
                        'label_attr' => array('title' => 'Project complexity associated with this project'),
                        'query_builder' => function (EntityRepository $v) {
                            return $v->createQueryBuilder('v')
                                ->orderBy('v.name',' ASC');
                        }
                    ))
            ;
        }
    
        /**
         * {@inheritdoc}
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'AppBundle\Entity\Product'
                )
            );
        }
    
        /**
         * {@inheritdoc}
         */
        public function getBlockPrefix()
        {
            return 'app_bundle_product_type';
        }
    }
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   Geoff Maddock    9 年前

    我知道这里发生了什么。这是ProjectComplexity实体的配置问题,该实体是从数据库对其ORM注释配置进行反向工程的结果。

    我最后注意到,在ProjectComplexity实体类中,id PK是布尔值:

    /**
     * @var boolean
     *
     * @ORM\Column(name="id", type="boolean")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
    

    一旦我将注释更改为使用integer,它就按预期工作:

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;