Symfony 显示名称,但插入带有实体字段类型的id

Symfony 显示名称,但插入带有实体字段类型的id,symfony,Symfony,表格为实体服务 namespace Main\HomeBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class ServicesType extends Abstrac

表格为实体服务

    namespace Main\HomeBundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class ServicesType extends AbstractType
    {
            /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('techId', 'entity', array(
                    'class' => 'MainHomeBundle:Technical',
                    'property' => 'id',
                ))
                ->add('status', 'choice', array(
                        'choices'   => array(
                        'pending'   => 'Pending',
                        'finished' => 'Finished',
                    ), 'multiple'  => false), array('required'=>true))
                ->add('payment', 'text', array('required'=>true))
                ->add('endtime', 'datetime', array('required'=>true))
                ->add('send', 'submit')
            ;
        }

        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Main\HomeBundle\Entity\Services'
            ));
        }

        /**
         * @return string
         */
        public function getName()
        {
            return 'main_homebundle_services';
        }
    }
class Services
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="customer_id", type="integer", nullable=false)
     */
    private $customerId;

    /**
     * @var integer
     *
     * @ORM\Column(name="tech_id", type="integer", nullable=true)
     */
    private $techId;
使用此方法可在更新表单中显示选定用户。问题是,在发送数据时,发送名称并希望在选择框中显示名称的同时发送id

不要使用数据库或实体中的关系

    namespace Main\HomeBundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class ServicesType extends AbstractType
    {
            /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('techId', 'entity', array(
                    'class' => 'MainHomeBundle:Technical',
                    'property' => 'id',
                ))
                ->add('status', 'choice', array(
                        'choices'   => array(
                        'pending'   => 'Pending',
                        'finished' => 'Finished',
                    ), 'multiple'  => false), array('required'=>true))
                ->add('payment', 'text', array('required'=>true))
                ->add('endtime', 'datetime', array('required'=>true))
                ->add('send', 'submit')
            ;
        }

        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Main\HomeBundle\Entity\Services'
            ));
        }

        /**
         * @return string
         */
        public function getName()
        {
            return 'main_homebundle_services';
        }
    }
class Services
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="customer_id", type="integer", nullable=false)
     */
    private $customerId;

    /**
     * @var integer
     *
     * @ORM\Column(name="tech_id", type="integer", nullable=true)
     */
    private $techId;
实体服务要插入服务的techId中的技术id

    namespace Main\HomeBundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class ServicesType extends AbstractType
    {
            /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('techId', 'entity', array(
                    'class' => 'MainHomeBundle:Technical',
                    'property' => 'id',
                ))
                ->add('status', 'choice', array(
                        'choices'   => array(
                        'pending'   => 'Pending',
                        'finished' => 'Finished',
                    ), 'multiple'  => false), array('required'=>true))
                ->add('payment', 'text', array('required'=>true))
                ->add('endtime', 'datetime', array('required'=>true))
                ->add('send', 'submit')
            ;
        }

        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Main\HomeBundle\Entity\Services'
            ));
        }

        /**
         * @return string
         */
        public function getName()
        {
            return 'main_homebundle_services';
        }
    }
class Services
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="customer_id", type="integer", nullable=false)
     */
    private $customerId;

    /**
     * @var integer
     *
     * @ORM\Column(name="tech_id", type="integer", nullable=true)
     */
    private $techId;
techId正在与另一个实体链接

class Technical
{

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

    /**
     * @var string
     * 
     * @Assert\NotBlank()
     * @Assert\Length(
     * min = 8,
     * max = 55,
     * minMessage = "{{ limit }}",
     * maxMessage = "{{ limit }}"
     * )
     *
     * @ORM\Column(name="name", type="string", length=55, nullable=false)
     */
    private $name;

    public function __toString()
    {
        return $this->nombre;
    }

由于数据库或实体中没有关系,因此仅提供信息的方式在这种情况下使用实体字段是错误的-表单将尝试将技术类的实例映射到服务的整数$techId字段上,该字段无法工作

    namespace Main\HomeBundle\Form;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;

    class ServicesType extends AbstractType
    {
            /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('techId', 'entity', array(
                    'class' => 'MainHomeBundle:Technical',
                    'property' => 'id',
                ))
                ->add('status', 'choice', array(
                        'choices'   => array(
                        'pending'   => 'Pending',
                        'finished' => 'Finished',
                    ), 'multiple'  => false), array('required'=>true))
                ->add('payment', 'text', array('required'=>true))
                ->add('endtime', 'datetime', array('required'=>true))
                ->add('send', 'submit')
            ;
        }

        /**
         * @param OptionsResolverInterface $resolver
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Main\HomeBundle\Entity\Services'
            ));
        }

        /**
         * @return string
         */
        public function getName()
        {
            return 'main_homebundle_services';
        }
    }
class Services
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @var integer
     *
     * @ORM\Column(name="customer_id", type="integer", nullable=false)
     */
    private $customerId;

    /**
     * @var integer
     *
     * @ORM\Column(name="tech_id", type="integer", nullable=true)
     */
    private $techId;
您需要使用标准的选项字段,并将(技术实体)id选项列表作为选项传递到buildForm()中

形式如下:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
            ->add('techId', 'choice', array(
                'choices' => $options['techChoices'],
            ))
    ...
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'techChoices' => array(),
    ));
}
在控制器中:

$repository = $this->getDoctrine()->getRepository('MainHomeBundle:Technical');
$technicals = $repository->findAll();
$techChoices = array();
foreach($technicals as $t) { $techChoices[$t->getId()] = $t->getName(); }

$formOptions = array('techChoices' => $techChoices);
$form = $this->createForm(new ServicesType(), $aServices, $formOptions);

请显示完整的表单类型和用户实体为什么需要发送id?添加更多信息建议如何获取值​​控制器中的数组是否为空?@Eguiarte我不理解您的评论,但我已编辑了我的答案,以提供在控制器中填充$techChoices数组的代码。您可以在以下自定义存储库类中找到如何执行此操作:。如果您想这样做,但无法解决问题,您需要单独发布一个问题。@Eguiarte注意-我不主张使用诸如“$t”之类的速记变量名,但这使代码在本文中更具可读性。这是我的问题,感谢您花时间解决我的问题,您是一个好人。