我是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...
}
}
}
}
请帮忙!我变得疯了!感谢
答案 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();
将轻松工作