Symfony 如何持久化包含以表单形式显示为选择列表的属性的实体

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

我是symfony的新手。 我正在使用symfony 2.7.6进行一个项目。 我有一个对象/实体“Trajet”,它包含两个属性(这是我头疼的根源!!)。 这两个属性是VilledPart和VillerRivee(通过条令链接到我的数据库的整数(对象类中的ORM注释)) 在我的表单中,我希望它们显示为下拉列表。所以我使用了一个具有两个实体字段类型的formbuilder

<>但是当我试图在控制器中使用“TrjJET”对象(使用实体管理器)时,我得到了一个SQL错误(因为它把两个属性VeleDePART和VilleArrivee视为实体而不是整数)… 我清楚地看到问题在哪里。。。sql查询是

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();}请编辑问题添加代码!同时添加错误!