如何将包含表单中显示的属性的实体持久化为选择列表

时间:2015-11-19 16:07:48

标签: symfony doctrine-orm php-5.5

我是symfony的新手。 我正在使用symfony 2.7.6开展项目。 我有一个对象/实体“Trajet”,其中包含2个属性(这是我头痛的来源!!)。 这两个属性是VilleDepart和VilleArrivee(整数链接到我的数据库与doctrine(对象类中的ORM注释)) 在我的表单中,我希望它们显示为下拉列表。所以我使用了一个带有两个实体字段类型的formbuilder。

但是当我尝试在控制器中持久保存“Trajet”对象(使用实体管理器)时,我得到一个sql错误(因为它认为VilleDepart和VilleArrivee这两个属性是实体而不是整数)... 我清楚地看到问题出在哪里...... sql查询是

INSERT INTO trajet (traj_villedepart , traj_villearrivee) VALUES ({}, {})

而不是

INSERT INTO trajet (traj_villedepart , traj_villearrivee) VALUES (1, 2)

例如

这是他的班级训练

 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...
            }


          }
    }
}

请帮忙!我变得疯了!感谢

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案:在Trajet和Ville之间建立单向的oneToone关系我修改了类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();

将轻松工作