Symfony 如何持久化包含以表单形式显示为选择列表的属性的实体
我是symfony的新手。 我正在使用symfony 2.7.6进行一个项目。 我有一个对象/实体“Trajet”,它包含两个属性(这是我头疼的根源!!)。 这两个属性是VilledPart和VillerRivee(通过条令链接到我的数据库的整数(对象类中的ORM注释)) 在我的表单中,我希望它们显示为下拉列表。所以我使用了一个具有两个实体字段类型的formbuilder <>但是当我试图在控制器中使用“TrjJET”对象(使用实体管理器)时,我得到了一个SQL错误(因为它把两个属性VeleDePART和VilleArrivee视为实体而不是整数)… 我清楚地看到问题在哪里。。。sql查询是Symfony 如何持久化包含以表单形式显示为选择列表的属性的实体,symfony,doctrine-orm,php-5.5,Symfony,Doctrine Orm,Php 5.5,我是symfony的新手。 我正在使用symfony 2.7.6进行一个项目。 我有一个对象/实体“Trajet”,它包含两个属性(这是我头疼的根源!!)。 这两个属性是VilledPart和VillerRivee(通过条令链接到我的数据库的整数(对象类中的ORM注释)) 在我的表单中,我希望它们显示为下拉列表。所以我使用了一个具有两个实体字段类型的formbuilder 但是当我试图在控制器中使用“TrjJET”对象(使用实体管理器)时,我得到了一个SQL错误(因为它把两个属性VeleDePA
INSERT INTO trajet (traj_villedepart , traj_villearrivee) VALUES ({}, {})
而不是
INSERT INTO trajet (traj_villedepart , traj_villearrivee) VALUES (1, 2)
比如说
这是我的班级trajet
class Trajet {
/**
* @ORM\Id @ORM\Column(name="idtrajet", type="integer")
* @ORM\GeneratedValue
*/
private $ID;
/**
* @ORM\Column(name="traj_idvilledepart", type="integer")
*/
private $VilleDepart;
/**
* @ORM\Column(name="traj_idvillearrivee", type="integer")
*/
private $VilleArrivee;
//Getters and setters....
}
这是我抽象的Trajet类型
class TrajetType extends AbstractType
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('DescriptionVoiture', 'textarea')
->add('VilleDepart', 'entity', array(
'class' => 'MyBundle:Ville',
'property' => 'Nom',
'em' => 'pgsql',
'query_builder' => function(VilleRepository $er){
return $er->getVillesOrderByOrdre();
},
))
->add('VilleArrivee', 'entity', array(
'class' => 'MyBundle:Ville',
'property' => 'Nom',
'em' => 'pgsql',
'query_builder' => function(VilleRepository $er){
return $er->getVillesOrderByOrdre();
},
))
}
public function getName()
{
return 'trajet';
}
}
最后是我的控制器
class TrajetController extends Controller {
public function AddEditTrajetAction($idTrajet = null) {
$manager = $this->getDoctrine()->getManager('pgsql');
$trajet = new Trajet();
//Initialize the object $trajet with the get ID....
$form = $this->createForm(new TrajetType($manager), $trajet);
$request = $this->getRequest();
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid()) {
$manager->persist($trajet);
$manager->flush();
//Return to the view...
}
}
}
}
请帮忙!我疯了!!谢谢我终于找到了解决办法:在Trajet和Ville之间建立一个单向的一对一关系。我这样修改了Trajet类
class Trajet {
/**
*@ORM\OneToOne(targetEntity="xxx\Entity\Ville")
*@ORM\JoinColumn(name="traj_idvilledepart", ReferencedColumnName="idville", nullable=false)
*/
private $VilleDepart;
//The same for VilleArrivee...
//Getters and setters....
}
然后在控制器中
$manager->persist($trajet);
$manager->flush();
将很容易工作代码的一部分将是可观的。您可以从您定义“Trajet”的实体类发布代码吗?可能有几种方法可以解决您的问题,这取决于您的类的外观。我猜你的属性VilledPart和VillerRivee本身就是实体,对吗?听起来你可能需要一个数据转换器来在整数和实体之间进行转换。但就像前面的评论员一样,我不清楚到底发生了什么。对不起,实际上,我没有把代码放在这里。在这里<代码>类Trajet{//int private$ID;//int private$VilleDepart;//int private$VillerRivee;//控制器`类TrajetController扩展控制器{public function ProposerTrajetAction(Request$Request){$Trajet=new Trajet();$form=$this->get('form.factory')->createBuilder('form',$Trajet)->add('VilleDepart','entity',array('class'=>'mybundle:Ville','property'=>'Nom','em'=>'pgsql',)->add('VillerRivee','entity',…)..$em=$this->getDoctrine()->getManager('pgsql');$em->persist($trajet);$em->flush();}请编辑问题添加代码!同时添加错误!