Symfony - EntityType select 重复相同的选项
Symfony - EntityType select repeats the same option
在 Symfony 3.3.4 中构建表单,并使用 EntityType
获取 select 对象列表。
出于某种原因,当我使用某个实体时,select 列出 returns 所有具有相同 ID 的相同选项,即使数据库 table 包含具有不同 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');
},
))
使用相同的格式添加其他对象可以正常工作。
这是完整的表格类型 class:
<?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';
}
}
我明白这是怎么回事了。这是 ProjectComplexity 实体的配置问题,它是从数据库中对其 ORM 注释配置进行逆向工程的结果。
我终于在 ProjectComplexity 实体 class 中注意到,id PK 是 BOOLEAN:
/**
* @var boolean
*
* @ORM\Column(name="id", type="boolean")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
我使用 Symfony 网站上描述的逆向工程方法生成了这个实体,并查看数据库中的列定义,table 中的 id 列是 tinyint(3)。我只能假设逆向工程默认转换为布尔值。
一旦我将注释更改为使用整数,它就按预期工作了:
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
在 Symfony 3.3.4 中构建表单,并使用 EntityType
获取 select 对象列表。
出于某种原因,当我使用某个实体时,select 列出 returns 所有具有相同 ID 的相同选项,即使数据库 table 包含具有不同 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');
},
))
使用相同的格式添加其他对象可以正常工作。
这是完整的表格类型 class:
<?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';
}
}
我明白这是怎么回事了。这是 ProjectComplexity 实体的配置问题,它是从数据库中对其 ORM 注释配置进行逆向工程的结果。
我终于在 ProjectComplexity 实体 class 中注意到,id PK 是 BOOLEAN:
/**
* @var boolean
*
* @ORM\Column(name="id", type="boolean")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
我使用 Symfony 网站上描述的逆向工程方法生成了这个实体,并查看数据库中的列定义,table 中的 id 列是 tinyint(3)。我只能假设逆向工程默认转换为布尔值。
一旦我将注释更改为使用整数,它就按预期工作了:
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;