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”之类的速记变量名,但这使代码在本文中更具可读性。这是我的问题,感谢您花时间解决我的问题,您是一个好人。