2017-07-20 52 views
0

在Symfony 3.3.4中構建表單並使用EntityType獲取對象的選擇列表。Symfony - EntityType select重複相同的選項

由於某些原因,當我使用某個實體時,即使數據庫表包含具有不同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'; 
    } 
} 
+0

發生什麼情況,如果說,在一個控制器,你再說一遍,QueryBuidler查詢和結果轉儲?還是一樣的東西?或者你看到不同的價值觀? –

+0

對不起,但你有沒有檢查過數據庫中的值?因爲它看起來沒問題。 –

+0

您可以發佈您的完整表單類型嗎? – ste

回答

0

我想通了什麼怎麼回事。這是ProjectComplexity實體的配置問題,它是從數據庫中反向設計ORM註釋配置的結果。

我終於在ProjectComplexity實體類注意到,該ID PK是布爾:

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

我已經產生了使用Symfony的網站上描述的逆向工程方法這個實體,並期待在列定義數據庫中,該表中的id列是tinyint(3)。我只能假設逆向工程默認轉換爲布爾值。

一旦我改用整數註釋,這和預期一樣:

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