我花了几个小时找到问题的解决方案,我希望在这里找到答案。
以下是我的表单代码(ExperienceType):
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('intitulePoste')
->add('entreprise')
->add('dateDebut')
->add('dateFin')
->add('mission')
->add('idContrat', 'entity', array(
'class' => 'ClasseBundle:Contrat',
'property' => 'contrat',
// 'property_path' => false,
'multiple' => false,
'mapped' => true,
'empty_value' => 'Contrat',
// 'expanded'=> true,
))
->add('idville', 'entity', array(
'class' => 'ClasseBundle:Ville',
'property' => 'nom',
// 'property_path' => false,
'multiple' => false,
'mapped' => true,
'attr' => array(
'class' => 'lesvilles'
),
'empty_value' => 'Ville',
))
;
}
以下是负责在数据库中注册实体的方法:
public function testAction()
{
$exp = new Experience();
$form = $this->createForm(new ExperienceType(), $exp);
$request = $this->get('request');
if ($request->getMethod() == 'POST')
{
$form->bind($request);
if ($form->isValid())
{
$em = $this->getDoctrine()->getManager();
$exp = $form->getData();
$exp->setIdMembre($this->idMembreAction());
$em->persist($exp);
$em->flush();
return $this->redirect($this->generateUrl('test'));
}
}
return $this->render('MembreBundle:Default:FormExp.html.twig', array(
'form' => $form->createView()));
}
当我验证表单时,我收到此错误:" HTTP错误500(内部服务器错误)" 然后使用文件 dev.log 我读了这条消息:
doctrine.DEBUG:INSERT INTO Experience(idContrat,idMembre,idVille, intitulePoste公司,StartDate,EndDate,mission)VALUES {" 1" (,,,,,,, ????):" [object](project \ \ ClasseBundle \ \ Entity \ \ 合同:{})"," 2":1," 3":" [对象](项目\ \ ClasseBundle \ \ Entity \ \ City:{})"," 4"," ggg"," 5":"华夫饼"," 6"," 2222/22/22"," 7"," 2222/22/22"," 8":" hjjhjhj"} []
所以我在ExperienceType文件中添加了idVille和idContart字段的条件( required false ) 我在Experience.php文件(实体)中添加了两个字段都接受空值( nullable = true ) 当我验证我的表单时,我的实体存储在数据库中没有问题。 那么问题是什么?感谢
答案 0 :(得分:1)
您可能以错误的方式映射对象。
我在你看到名为idContrat
的表单字段,它建议你尝试存储对象Contract
的id属性。这就是你在该对象中需要__toString()
方法的原因。
您的映射看起来应该更像:
/**
* @ORM\ManyToOne("You\SomeBundle\Entity\Contract")
* @ORM\JoinColumn(name="contract_id", referencedColumnName="id")
* /
protected $contract;
比:
/**
* @ORM\Column(name="idContract", type="integer")
* /
protected $contract_id;
答案 1 :(得分:0)
byf-ferdy's suggestion删除$exp = $form->getData();
看起来是正确的。
对于有类似问题的其他人,http://symfony.com/doc/2.1/book/forms.html#forms-and-doctrine有更多相关信息。
答案 2 :(得分:0)
您可以删除行$exp = $form->getData();
,因为它将数据作为array
而不是对象返回。由于您将$exp
变量传递给createForm()
方法,因此您的实体会自动映射到您的表单。